scrapy分页抓取网页(接下来分析如何要闻页签下的所有新闻标题和链接(图))
优采云 发布时间: 2021-10-25 18:08scrapy分页抓取网页(接下来分析如何要闻页签下的所有新闻标题和链接(图))
本文的目的是捕获所有在腾讯新闻首页新闻主页上签名的新闻标题和链接。
如图:
地址:
新闻标签中通常有几个标签:
因此,要抓取所有新闻标题和新闻下的链接,需要一一抓取。让我们开始编写代码。
首先获取腾讯新闻页面的内容,编写一个接口获取页面。
首先导入本次爬网所需的库
# -*- coding:utf-8 -*-
#Python抓取网页必备的库
import urllib
import urllib2
#正则表达式
import re
#随机数生成
import random
#gzip
import gzip
from StringIO import StringIO
构建请求头、请求页面
#构建页面请求的头部
headers = {'User-Agent':user_agent, "Referer":referer}
#构建页面请求
request = urllib2.Request(url, headers=headers)
#请求目的页面,设置超时时间为45秒
response = urllib2.urlopen(request, timeout = 45)
请求一个腾讯新闻页面,返回的页面数据有时会被gzip压缩,如果直接读取会出现二进制代码,所以在处理返回的页面时需要做gizp解压
#如果经过gzip压缩则先解压,否则直接读取
if response.info().get('Content-Encoding') == 'gzip':
buf = StringIO(response.read())
f = gzip.GzipFile(fileobj=buf)
html = f.read()
else:
html = response.read()
整理代码段,最后封装成页面请求接口
#user-agent
user_agent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
#抓取页面接口,参数为地址和referer
def getHtml(url, referer = None):
try:
#构建页面请求的头部
headers = {'User-Agent':user_agent, "Referer":referer}
#构建页面请求
request = urllib2.Request(url, headers=headers)
#请求目的页面,设置超时时间为45秒
response = urllib2.urlopen(request, timeout = 45)
html = None
#如果经过gzip压缩则先解压,否则直接读取
if response.info().get('Content-Encoding') == 'gzip':
buf = StringIO(response.read())
f = gzip.GzipFile(fileobj=buf)
html = f.read()
else:
html = response.read()
return html
#如果请求异常
except urllib2.URLError, e:
if hasattr(e, "code"):
print e.code
elif hasattr(e, "reason"):
print e.reason
return None
#其他异常
except Exception,e:
return None
页面请求接口写好后,接下来就是分析如何上报新闻页面下的所有数据。新闻页面下有几个选项卡。当我们请求分页时,可以看到腾讯新闻页面的请求是通过ajax实现的。打开谷歌在浏览器的网络中,可以看到请求分页时的信息。如图:
分析请求地址会发现每一个分页请求都是一个地址后面跟着一个随机数,地址中会有这个请求的索引。
这样我们就可以构造出页面的请求地址,获取到每个页面的信息。但在此之前,我们不知道腾讯新闻会有多少页。
分析腾讯新闻的页面,我们最终会发现首页的一段js表示腾讯新闻有多少个页面。
所以我们先抓取腾讯新闻页面的内容,获取新闻中有多少个页面,构造页面请求,最后取出页面信息中的所有新闻
标题和原创链接就好了。代码显示如下:
<p>def tencentStart():
#腾讯新闻地址
INDEX_URL = 'http://news.qq.com/top_index.shtml#hotnews'
#腾讯要闻请求地址
SUB_URL = "http://news.qq.com/c/2013ywList_{0}.htm"
#页面数获取正则
PAGE_PATTERNS = 'getString.pageCount.*?=.*?(\d+);'
#标题和链接获取正则
NEWS_PATTERNS = '