* 网络爬虫 <https://blog.csdn.net/qq_41781877/article/details/80490337#网络爬虫>
* 爬虫的应用领域 <https://blog.csdn.net/qq_41781877/article/details/80490337#爬虫的应用领域>
* 相关工具 <https://blog.csdn.net/qq_41781877/article/details/80490337#相关工具>
* 一个简单的爬虫 <https://blog.csdn.net/qq_41781877/article/details/80490337#一个简单的爬虫>
* 方法一:python自带的方式:urllib
<https://blog.csdn.net/qq_41781877/article/details/80490337#方法一python自带的方式urllib>
* urlopen(url).read()表示获取到url地址然后.decode(参数)解码
<https://blog.csdn.net/qq_41781877/article/details/80490337#urlopenurlread表示获取到url地址然后decode参数解码>
* 原生方法需要用正则表达式去获取页面中想要的参数
<https://blog.csdn.net/qq_41781877/article/details/80490337#原生方法需要用正则表达式去获取页面中想要的参数>
* 方法二:第三方BeautifulSoup
<https://blog.csdn.net/qq_41781877/article/details/80490337#方法二第三方beautifulsoup>
* 需要记住的是获得网站后用content.decode()解码
<https://blog.csdn.net/qq_41781877/article/details/80490337#需要记住的是获得网站后用contentdecode解码>
* BeautifulSoup解析页面需要将里面参数改为lxml
<https://blog.csdn.net/qq_41781877/article/details/80490337#beautifulsoup解析页面需要将里面参数改为lxml>
* 用选择器语法获取标签中的值
<https://blog.csdn.net/qq_41781877/article/details/80490337#用选择器语法获取标签中的值>
* 用attrs属于获取中的属性值
<https://blog.csdn.net/qq_41781877/article/details/80490337#用attrs属于获取中的属性值>
* select和find区别
<https://blog.csdn.net/qq_41781877/article/details/80490337#select和find区别>
* 注意事项: <https://blog.csdn.net/qq_41781877/article/details/80490337#注意事项>


网络爬虫

网络爬虫(web
crawler),以前经常称之为网络蜘蛛(spider),是按照一定的规则自动浏览万维网并获取信息的机器人程序(或脚本),曾经被广泛的应用于互联网搜索引擎。使用过互联网和浏览器的人都知道,网页中除了供用户阅读的文字信息之外,还包含一些超链接。网络爬虫系统正是通过网页中的超链接信息不断获得网络上的其它页面。正因如此,网络数据采集的过程就像一个爬虫或者蜘蛛在网络上漫游,所以才被形象的称为网络爬虫或者网络蜘蛛。

爬虫的应用领域

在理想的状态下,所有ICP(Internet Content
Provider)都应该为自己的网站提供API接口来共享它们允许其他程序获取的数据,在这种情况下爬虫就不是必需品,国内比较有名的电商平台(如淘宝、京东等)、社交平台(如腾讯微博等)等网站都提供了自己的Open
API,但是这类Open
API通常会对可以抓取的数据以及抓取数据的频率进行限制。对于大多数的公司而言,及时的获取行业相关数据是企业生存的重要环节之一,然而大部分企业在行业数据方面的匮乏是其与生俱来的短板,合理的利用爬虫来获取数据并从中提取出有价值的信息是至关重要的。当然爬虫还有很多重要的应用领域,以下列举了其中的一部分:

搜索引擎
新闻聚合
社交应用
舆情监控
行业数据

相关工具

robotparser —— 解析网站爬虫规则
httpie 代码版的postman
python——whois 网站的所有者
BuiltWith:识别网站使用的技术 builtwith.parse(‘http://www.bootcss.com/
<http://www.bootcss.com/>‘)

一个简单的爬虫

大致构造:
获取url,对网络解码,选择需要的字段,用正则表达式对数据进行处理


分为两种方法

方法一:python自带的方式:urllib

urlopen(url).read()表示获取到url地址然后.decode(参数)解码

原生方法需要用正则表达式去获取页面中想要的参数
from urllib.error import URLError from urllib.request import urlopen import re
import pymysql def get_page_code(start_url, *, retry_times=3, charsets=('utf-8'
, )): try: for charset in charsets: try: html =
urlopen(start_url).read().decode(charset)break except UnicodeDecodeError: html =
None except URLError as ex: print('Error:', ex) return get_page_code(start_url,
retry_times=retry_times -1, charsets=charsets) if \ retry_times > 0 else None
return html # 通过设置列表保存url地址,就可以达到大量获取数据的方法 # visited_list键值段存入键值,如果有相同的就不用再读取他了
def main(): url_list = ['http://sports.sohu.com/nba_a.shtml'] visited_list =
set({})while len(url_list) > 0: current_url = url_list.pop(0)
visited_list.add(current_url) html = get_page_code(current_url, charsets=(
'utf-8', 'gbk', 'gb2312')) if html: # 原生方法需要用正则表达式去获取页面中想要的参数,IGNORECASE区分大小写
link_regex = re.compile(r'<a[^>]+href=["\'](.*?)["\']', re.IGNORECASE) #
re.findall存入到列表中 link_list = re.findall(link_regex, html) # 添加到列表中 url_list +=
link_list# 保存到数据库 conn = pymysql.connect(host='localhost', port=3306, db=
'crawler', user='root', passwd='123456', charset='utf8') try: for link in
link_list:if link not in visited_list: # 添加到键值段中 visited_list.add(link) html =
get_page_code(link, charsets=('utf-8', 'gbk', 'gb2312')) if html: title_regex =
re.compile(r'<h1>(.*)<span', re.IGNORECASE) match_list =
title_regex.findall(html)if len(match_list) > 0: title = match_list[0] with
conn.cursor()as cursor: # 原生slq语句把数据存到数据库中 cursor.execute('insert into
tb_result (rtitle, rurl) values (%s, %s)', (title, link)) conn.commit() finally
: conn.close() print('执行完成!') if __name__ == '__main__': main()
方法二:第三方BeautifulSoup

pip install bs4 lxml requests

通过requests获得然后bs4和lxml解析

需要记住的是获得网站后用content.decode()解码

BeautifulSoup解析页面需要将里面参数改为lxml

用选择器语法获取标签中的值

用attrs属于获取中的属性值
from bs4 import BeautifulSoup import requests import re def main(): #
通过requests第三方库的get方法获取页面 resp = requests.get(
'http://sports.sohu.com/nba_a.shtml') # 对响应的字节串(bytes)进行解码操作(搜狐的部分页面使用了GBK编码)
html = resp.content.decode('gbk') # 创建BeautifulSoup对象来解析页面(相当于JavaScript的DOM)
bs = BeautifulSoup(html,'lxml') # 通过CSS选择器语法查找元素并通过循环进行处理 # 方法一: # for elem in
bs.find_all(lambda x: 'test' in x.attrs): # 方法二: for elem in bs.select('a[test]'
):# 通过attrs属性(字典)获取元素的属性值 link_url = elem.attrs['href'] resp =
requests.get(link_url) bs_sub = BeautifulSoup(resp.text,'lxml') #
使用正则表达式对获取的数据做进一步的处理 print(re.sub(r'[\r\n]', '', bs_sub.find('h1').text)) if
__name__ =='__main__': main()
select和find区别

find表示找的值,select表示找的标签
print(soup.find_all(re.compile(r'p$'))) print(soup.find_all('img', {'src':
re.compile(r'\./img/\w+.png')})) print(soup.find_all(lambda x: len(x.attrs) ==
2)) print(soup.find_all('p', {'class': 'foo'})) for elem in
soup.select('a[href]'): print(elem.attrs['href'])
注意事项:


1.处理相对链接。有的时候我们从页面中获取的链接不是一个完整的绝对链接而是一个相对链接,这种情况下需要将其与URL前缀进行拼接(urllib.parse中的urljoin函数可以完成此项操作)。


2.设置代理服务。有些网站会限制访问的区域(例如美国的Netflix屏蔽了很多国家的访问),有些爬虫需要隐藏自己的身份,在这种情况下可以设置代理服务器(urllib.request中的ProxyHandler就是用来进行此项操作)。


3.限制下载速度。如果我们的爬虫获取网页的速度过快,可能就会面临被封禁或者产生“损害动产”的风险(这个可能会导致吃官司且败诉哦),可以在两次下载之间添加延时从而对爬虫进行限速。


4.避免爬虫陷阱。有些网站会动态生成页面内容,这会导致产生无限多的页面(例如在线万年历等)。可以通过记录到达当前页面经过了多少个链接(链接深度)来解决该问题,当达到事先设定的最大深度时爬虫就不再像队列中添加该网页中的链接了。

5.SSL相关问题。在使用urlopen打开一个HTTPS链接时会验证一次SSL证书,如果不做出处理会产生错误提示“SSL:
CERTIFICATE_VERIFY_FAILED”

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信