用scrapy框架爬取腾讯新闻,看看都有那些好新闻

点击“简说Python”,选择“星标公众号”

福利干货,第一时间送达!

用scrapy框架爬取腾讯新闻,看看都有那些好新闻_第1张图片

@图片自制by小si

//

本文作者

王豪行路难,多歧路,今安在,埋头苦改bug会有时,直到bug改完才吃饭

//

阅读文本大概需要 9 分钟。

一、知识要求
二、爬取腾讯新闻实战
1.通过分析获取存放每个新闻链接的网址
2.创建数据库来存放爬取的新闻标题和链接
3.创建并编写一个爬取爬取腾讯新闻的scrapy项目
4.运行项目

一、知识要求

  • 会抓包分析

二、爬取腾讯新闻实战

1.通过分析获取存放每个新闻链接的网址

(1)分析网页源代码中是否有新闻的链接:

用scrapy框架爬取腾讯新闻,看看都有那些好新闻_第2张图片

通过分析,我们发现网页源代码中不含有新闻链接,但是,有很多js包,由此,我们自然的想到抓包分析。


(2)抓包分析:
①打开安装过代理的浏览器,我这里是火狐浏览器,然后进入到腾讯新闻首页
②打开抓包分析的工具 Fiddler ,然后用clear命令清空列表。 如下:
用scrapy框架爬取腾讯新闻,看看都有那些好新闻_第3张图片

③在火狐浏览器中刷新腾讯首页,Fiddler中会出现抓取一些数据包:
用scrapy框架爬取腾讯新闻,看看都有那些好新闻_第4张图片

④通过看包分析,发现带有 /irs/rcd?cid 的js包含有新闻的链接和标题,所以我们的任务是要找到所有的这样的js包的网址:
用scrapy框架爬取腾讯新闻,看看都有那些好新闻_第5张图片

④找出所有的这样的js包,复制其网址,找出规律: 发现第一个js包和第二个js包的网址没有规律,从第三个js包开始就有规律了,有这样的规律: https://pacaio.match.qq.com/irs/rcd?cid=108&ext=&token=349ee24cdf9327a050ddad8c166bd3e3&page=6&callback=__jp9 其中page=6是第4个js包,jp9总是比前面的page=的值大3,所以,我们通过构造page的值和jp的值,就可以构造出js包的网址。
用scrapy框架爬取腾讯新闻,看看都有那些好新闻_第6张图片

2.创建数据库来存放爬取的新闻标题和链接

这里,我创建了一个名为 tengxun 的数据库,并在该数据库中建立了一张名为 news 的表:
用scrapy框架爬取腾讯新闻,看看都有那些好新闻_第7张图片

3.创建并编写一个爬取爬取腾讯新闻的scrapy项目

1)创建 该爬虫项目和爬虫文件我就不多做说明了,如果不会可以 ,我创建的项目如下:
用scrapy框架爬取腾讯新闻,看看都有那些好新闻_第8张图片

(2)编写爬虫项目:
①item.py文件:
 1# -*- coding: utf-8 -*-
 2
 3# Define here the models for your scraped items
 4#
 5# See documentation in:
 6# https://doc.scrapy.org/en/latest/topics/items.html
 7
 8import scrapy
 9
10
11class TengxunnewsItem(scrapy.Item):
12    # define the fields for your item here like:
13    # name = scrapy.Field()
14    title = scrapy.Field()  # 设置标题容器
15    link = scrapy.Field()   # 设置链接容器

②tx.py文件:

 1# -*- coding: utf-8 -*-
 2import scrapy
 3from tengxunnews.items import *
 4from scrapy.http import Request
 5import re
 6
 7
 8class TxSpider(scrapy.Spider):
 9    name = 'tx'
10    allowed_domains = ['qq.com']    # 允许爬取的网址的域名
11    # 第一次爬取的网址,虽然写出是两行,实际是一行,只是很长换成两行了
12    start_urls = ['https://pacaio.match.qq.com/irs/rcd?cid=108&'
13                  'ext=&token=349ee24cdf9327a050ddad8c166bd3e3&page=0&expIds=&callback=__jp1']
14    # 来存放所有的js包地址
15    allLink = ['https://pacaio.match.qq.com/irs/rcd?cid=108&ext=&token=349ee24cdf9327a050ddad8c166bd3e3&page=0&expIds=&callback=__jp1', 
16               'https://pacaio.match.qq.com/irs/rcd?cid=4&token=9513f1a78a663e1d25b46a826f248c3c&ext=&page=0&expIds=&callback=__jp2']
17    # 后面再爬取7个js文件,总共爬取9个js文件
18    for i in range(0, 7):
19        # 构造每个js文件的地址
20        url = 'https://pacaio.match.qq.com/irs/rcd?cid=108&ext=&token=349ee24cdf9327a050ddad8c166bd3e3&page='+str(i+1)+'&callback=__jp'+str(i+4)
21        allLink.append(url) # j将构造的js包网址追加到allLink列表中
22
23    def parse(self, response):
24        # 爬取每个js包的数据
25        for link in self.allLink:
26            yield Request(link, callback=self.next)
27
28    def next(self, response):
29        # 获取每个js包内存放的新闻标题和新闻链接
30        item = TengxunnewsItem()
31        data = response.body.decode("utf-8", "ignore")
32        pat1 = '"title":"(.*?)"'
33        pat2 = '"surl":"(.*?)"'
34        item["title"] = re.compile(pat1).findall(data)
35        item["link"] = re.compile(pat2).findall(data)
36        yield item

③pipelines.py文件:

 
   

4.运行项目

(1)运行项目:
用scrapy框架爬取腾讯新闻,看看都有那些好新闻_第9张图片

(2)到数据库中查看结果:
用scrapy框架爬取腾讯新闻,看看都有那些好新闻_第10张图片
写数据库入成功!
(3)复制第一个一个网址,进入:

用scrapy框架爬取腾讯新闻,看看都有那些好新闻_第11张图片

与其标题相符合,确实就是该文章的链接。(4)至此,实战成功!!!


昨天最佳留言读者:Maverick,
请于2日内联系微信:jjxksa888,领取奖励。

用scrapy框架爬取腾讯新闻,看看都有那些好新闻_第12张图片

用scrapy框架爬取腾讯新闻,看看都有那些好新闻_第13张图片


厉害了我的国

今日留言主题
说说你看了本文后的感触?
读了上面Maverick读者留言感触?
或者一句激励自己的话?
(字数不少于15字)
我会选出一名同学赠出下面书籍
《机器学习线性代数》

北京大学出版社赞助
《机器学习线性代数》:线性代数是机器学习的基石
用scrapy框架爬取腾讯新闻,看看都有那些好新闻_第14张图片
扫码查看书籍详情

2小时快速掌握Python基础知识要点

完整Python基础知识要点

640?wx_fmt=jpeg
学Python | 聊赚钱

你可能感兴趣的:(用scrapy框架爬取腾讯新闻,看看都有那些好新闻)