目标
使用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]
#print(allling)
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)
#print(articles)
try:
for j in articles:
thisurl = "https://yq.aliyun.com" + j
thisdata = requests.get(thisurl).text
#print(thisdata)
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]
#print(title, content)
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。