使用Requests模块进行爬虫

it2025-02-08  8

目标

使用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。

最新回复(0)