目标
使用requests模块爬取云栖社区的博文数据
安装
在windows系统下,打开cmd使用pip install resquests安装
准备工作
想要爬取一个网站,首先需要分析这个网站上面的信息,不要急于去编写代码,比如这里我爬的云栖社区,网址是:https://yq.aliyun.com,我们进去之后,搜索关于Python类的文章 在图片当中我们可以看到,搜索到的数据有31716条,然后到下面翻页,并且把它们的网址放入一个记事本中,分析它们之间的区别 随后尝试着将一些无关的信息去掉,看看在浏览器中能否正常运行,最后得出关键部分q带的是关键词,p带的是页码 在将网址信息搞定之后,我们需要的做的是了解每个网页当中文章的条数,以及总共有多少页,这关系到我们的循环数,在上面有讲到关于关键词Python的数据有31716条,该网站每页有15条博文,那么我们的循环数就是31716 // 15 + 1次。 循环数也搞定之后,接下来就是分析每篇文章的链接,我使用的是正则匹配,通过查看网页的源代码,结合ctrl + F很轻松的便可以找到文章的链接 找出文章链接之后,会发现这里的网址是不全的,需要补全,具体如何补全这里不做陈述。点开文章,我主要是获取文章的标题和内容,也是和查找文章链接同样的方式,就不再陈述。
编码
import requests
import re
import time
key
= str(input("please input you want key: "))
url
= "https://yq.aliyun.com/search/articles/"
data
= requests
.get
(url
, params
={"q": key
}).text
pat1
= '<div class="_search-info">找到(.*?)条关于'
allling
= re
.compile(pat1
, re
.S
).findall
(data
)[0]
allpage
= int(allling
)
for i
in range(0, int(allpage
)):
print("-----正在爬第" + str(i
+ 1) + "页-----")
index
= str(i
+ 1)
getdata
= {"q": key
,
"p": index
,}
data
= requests
.get
(url
, params
= getdata
).text
pat_url
= '<div class="media-body text-overflow">.*?<a href="(.*?)">'
articles
= re
.compile(pat_url
, re
.S
).findall
(data
)
try:
for j
in articles
:
thisurl
= "https://yq.aliyun.com" + j
thisdata
= requests
.get
(thisurl
).text
pat_title
= '<p class="hiddenTitle">(.*?)</p>'
pat_content
= '<div class="content-detail unsafe markdown-body">(.*?)<div class="copyright-outer-line">'
title
= re
.compile(pat_title
, re
.S
).findall
(thisdata
)[0]
content
= re
.compile(pat_content
, re
.S
).findall
(thisdata
)[0]
fh
= open("F:\\Python\\爬虫\\requests爬虫\\" + str(i
) + "_" + str(time
.time
()) + ".html", "w", encoding
="utf-8")
fh
.write
(title
+ "<br /><br />" + content
)
fh
.close
()
except IndexError
:
pass
代码其实很简单,最后我是将爬取的数据保存到了本地中。需要注意的是,每做一步都需要进行测试,不然等你写完代码出错了,回去找bug很麻烦,这里需要提醒的是因为有些文章被删除了,爬取的时候会是空值,如果不进行异常处理的话,就会报错。
相关信息
请求方式:get、post、put等; 请求参数:params(get请求的参数)、headers(伪装浏览器,以字典方式存储)、proxies(伪装代理,以字典方式存储)、cookies、data(post请求的参数); text:响应数据; content:响应数据(b); encoding:网页编码; cookies:响应cookie; url:当前请求的url。