文章采集完(豆瓣网分析基础知识:如何获取真正请求的地址?)
优采云 发布时间: 2022-01-11 00:03文章采集完(豆瓣网分析基础知识:如何获取真正请求的地址?)
【一、项目背景】
豆瓣电影提供最新的电影介绍和评论,包括电影信息查询和已上映电影的购票服务。可以记录想看、正在看、看过的电影和电视剧,顺便打分,写影评。极大地方便了人们的生活。
今天以电视剧(美剧)为例,批量抓取对应的电影,写入csv文件。用户可以通过评分更好地选择他们想要的电影。
【二、项目目标】
获取对应的电影名称、评分、详情链接,下载电影图片,保存文档。
[三、涉及的图书馆和网站]
1、网址如下:
https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start={}
2、涉及的库:requests、fake_useragent、json、csv
3、软件:PyCharm
【四、项目分析】
1、如何请求多个页面?
当点击下一页时,每增加一页,paged 会增加 20,将转换后的变量替换为 {},然后使用 for 循环遍历 URL,实现多个 URL 请求。
2. 如何获取真实请求的地址?
请求数据时,发现页面没有对应的数据。其实豆瓣是用javascript动态加载内容来防止采集的。
1)F12 右键查看,找到Network,左侧菜单Name,找到第五条数据,点击Preview。
2)点击主题,可以看到标题是对应电影的名字。rate 是对应的分数。通过js解析主题字典,找到需要的字段。
3. 如何访问网络?
https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start=0
https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start=20
https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start=40
https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start=60
当点击下一页时,每增加一页会增加20,将转换后的变量替换为{},然后使用for循环遍历URL,实现多个URL请求。
【五、项目实施】
1、我们定义一个class类继承object,然后定义init方法继承self,再定义一个main函数main继承self。导入所需的库并请求 URL。
import requests,jsonfrom fake_useragent import UserAgentimport csv
class Doban(object): def __init__(self): self.url = "https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start={}"
def main(self): pass
if __name__ == '__main__': Siper = Doban() Siper.main()
2、随机生成UserAgent,构造请求头,防止反爬。
for i in range(1, 50): self.headers = { 'User-Agent': ua.random, }
3、发送请求,得到响应,回调页面,方便下次请求。
def get_page(self, url): res = requests.get(url=url, headers=self.headers) html = res.content.decode("utf-8") return html
4、json 解析页面数据,获取对应的字典。
data = json.loads(html)['subjects'] # print(data[0])
5、进行遍历,获取对应的电影名称、评分,并链接到下一个详情页。
print(name, goblin_herf) html2 = self.get_page(goblin_herf) # 第二个发生请求 parse_html2 = etree.HTML(html2) r = parse_html2.xpath('//div[@class="entry"]/p/text()')
6、创建用于写入的csv文件,定义对应的header内容,保存数据。
# 创建csv文件进行写入 csv_file = open('scr.csv', 'a', encoding='gbk') csv_writer = csv.writer(csv_file) # 写入csv标题头内容 csv_writerr.writerow(['电影', '评分', "详情页"]) #写入数据 csv_writer.writerow([id, rate, urll])
7、要请求的图片地址。定义图像名称并保存文档。
html2 = requests.get(url=urll, headers=self.headers).content dirname = "./图/" + id + ".jpg" with open(dirname, 'wb') as f: f.write(html2) print("%s 【下载成功!!!!】" % id)
8、调用方法实现功能。
html = self.get_page(url) self.parse_page(html)
9、项目优化:1)设置延时。
time.sleep(1.4)
2)定义一个变量u,用于遍历,表示爬到哪个页面。(更清晰和可观)。
u = 0 self.u += 1;
【六、效果展示】
1、点击绿色三角运行输入起始页和结束页(从第0页开始)。
2、在控制台显示下载成功信息。
3、保存 csv 文档。
4、电影图像显示。
【七、总结】
1、不建议爬取太多数据,容易造成服务器负载,试试看吧。
2、本文章针对应用中Python爬虫豆瓣的难点和关键点,以及如何防止反爬,做了一个相对的解决方案。
3、希望通过这个项目,可以帮助大家了解json解析页面的基本流程,字符串是如何拼接的,format函数是如何使用的。
4、本文基于Python网络爬虫,使用爬虫库获取豆瓣电影及其图片。在实现的时候,总会有各种各样的问题。不要想太多,用心去做,这样你才能更深入地理解它。
5、 需要本文源码的可以后台回复“豆瓣电影”字样获取。
看完这篇文章你有收获吗?请转发并分享给更多人
软件测试