爬虫

网络爬虫是自动从网页中获取网络资源(文字、图片)的程序。通常用于从提供数据资源的网站获取大量数据,同时也可以进行数据处理。搜索网站(如百度)实际上就是爬虫。

拓扑学习:需要先学会python语言(推荐python教程),需要对网页前端的知识有一定了解(推荐前端教程)。标准的爬虫会使用爬虫框架(如scrapy)。

近年,大多数网站都有针对网络爬虫的协议(如robots协议),盗亦有道,请在使用爬虫前仔细查阅并遵守规定。单从学习技术的角度来说,爬取的数据不作他用的情况下还是可以大胆实践的,但也不应开启过多爬虫干扰网站正常功能。

仅写干货,作为个人的知识学习和经验总结,各代码的详细用法可以网上查询。

参考链接:

中国大学MOOC:Python网络爬虫与信息提取

requests库:网络请求

涉及计算机网络的部分知识,了解原理有助于更好的实现爬虫,但不了解也不影响。requests库可以实现对网络请求的一些基本操作,最常用的是可以操控程序发送http协议的get请求,是爬虫获取网页资源的基础操作。status_code是http请求的返回状态,200表示请求成功。

1
2
3
4
5
import requests
for i in range(10): # 循环去请求网站
response = requests.get(url, headers=headers, proxies=proxies, timeout=20)
if response.status_code == 200:
break

其中url是要爬取的网址。例如:

1
url = "https://mugaiashe.github.io/"

现在的多数网站都设有反爬虫机制,最基本的就是检查网络请求的header。我常用的设置是:

1
2
headers = {'user-agent': "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
'Connection': 'close'}

如果需要设置代理:

1
2
3
4
proxies = {
'http': '127.0.0.1:7890',
'https': '127.0.0.1:7890'
} # 代理ip设置

beautiful soup库:查找数据

beautiful soup库用于处理网页数据,将获取的网页数据(很长的字符串)转换为特定的数据类型,使之可以读取,并能进行一些基本操作(如查找特定数据),简称bs4。

1
2
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml') # html是获取的网页数据,例如上面的response
查找数据

制定规则找到需要的数据是爬虫技术中需要注意的关键点!多观察网页前端的结构,常通过class进行定位。用soup.find_all找到soup网页中所有符合条件的块,对于每一块可以使用get获取对应的块信息(如图片img的url):

1
2
3
4
5
6
7
divimg = soup.find_all('img', {'class': 'x5yr21d xu96u03 x10l6tqk x13vifvy x87ps6o xh8yej3'})
for div in divimg:
imgurl = div.get('src')
if (imgurl == None):
print('imgurl none!')
continue
print(str(imgurl))

可以向下遍历,也可以向上遍历查找:

1
2
3
4
5
6
7
8
9
10
a = div.find_parent('a')
if (a == None):
print('a wrong!')
continue
urlto = a.get('href')
if (urlto == None):
print('url_to wrong!')
continue
totalurl = 'https://www.instagram.com' + urlto
print(totalurl)

re库:正则表达式

常使用re库,利用正则表达式的方式提取网页数据。因为网页中数据的表达方式各异,正则表达式能方便我们查找和提取数据。

1
2
3
4
5
6
7
ustr = re.findall(r'by .+? on', alt)
if (ustr == []):
print('ustr empty, no time!')
continue
usr = ustr[0].replace('by ', '')
usr = usr.replace(' on', '')
print(usr)

数据处理

selenium库:浏览器测试