正文
最近学完Python,写了几个爬虫练练手,网上的教程有很多,但是有的已经不能爬了,主要是网站经常改,可是爬虫还是有通用的思路的,即下载数据、解析数据、保存数据。下面一一来讲。
1.下载数据
首先打开要爬的网站,分析URL,每打开一个网页看URL有什么变化,有可能带上上个网页的某个数据,例如xxID之类,那么我们就需要在上一个页面分析HTML,找到对应的数据。如果网页源码找不到,可能是ajax异步加载,去xhr里去找。
有的网站做了反爬的处理,可以添加User-Agent :判断浏览器
?
1 2 3
|
self.user_agent =
'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
# 初始化 headers
self.headers = {
'User-Agent'
: self.user_agent}
|
如果不行,在Chrome上按F12分析请求头、请求体,看需不需要添加别的信息,例如有的网址添加了referer:记住当前网页的来源,那么我们在请求的时候就可以带上。
下载数据的模块有urllib、urllib2及Requests Requests相比其他俩个的话,支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自 动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码,而且api相对来说也简单,但是requests直接使用不能异步调用,速度慢。
?
1
|
html = requests.
get
(url, headers=headers) #没错,就是这么简单
|
urllib2以我爬取淘宝的妹子例子来说明:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
user_agent =
'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {
'User-Agent'
: user_agent}
# 注意:form data请求参数
params
=
'q&viewFlag=A&sortType=default&searchStyle=&searchRegion=city%3A&searchFansNum=¤tPage=1&pageSize=100'
def getHome():
url =
'https://mm.taobao.com/tstar/search/tstar_model.do?_input_charset=utf-8'
req = urllib2.Request(url, headers=headers)
# decode(’utf - 8’)解码 把其他编码转换成unicode编码
# encode(’gbk’) 编码 把unicode编码转换成其他编码
# ”gbk”.decode(’gbk’).encode(’utf - 8')
# unicode = 中文
# gbk = 英文
# utf - 8 = 日文
# 英文一 > 中文一 > 日文,unicode相当于转化器
html = urllib2.urlopen(req, data=
params
).read().decode(
'gbk'
).encode(
'utf-8'
)
# json转对象
peoples = json.loads(html)
for
i
in
peoples[
'data'
][
'searchDOList'
]:
#去下一个页面获取数据
getUseInfo(i[
'userId'
], i[
'realName'
])
|
2.解析数据
解析数据也有很多方式,我只看了beautifulsoup和正则,这个例子是用正则来解析的
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
def getUseInfo(userId, realName):
url =
'https://mm.taobao.com/self/aiShow.htm?userId='
+ str(userId)
req = urllib2.Request(url)
html = urllib2.urlopen(req).read().decode(
'gbk'
).encode(
'utf-8'
)
pattern = re.compile(
'<img.*?src=(.*?)/>'
, re.S)
items = re.findall(pattern, html)
x = 0
for
item
in
items:
if
re.match(r
'.*(.jpg")$'
, item.strip()):
tt =
'http:'
+ re.split(
'"'
, item.strip())[1]
down_image(tt, x, realName)
x = x + 1
print(
'下载完毕'
)
|