scrapy分页抓取网页( page=4那么我们是不是可以通过,改变页码去完成呢?)
优采云 发布时间: 2021-12-25 17:27scrapy分页抓取网页(
page=4那么我们是不是可以通过,改变页码去完成呢?)
页=4
那么我们可以改变页码(page)来完成分页吗?因为首页和7天热点类似,我用了7天热点的爬取思路来爬取(蜘蛛——Scrapy),但是很明显网址抓不到首页的信息。除了尝试所有参数之外别无他法。首先我们看一下seen_snote_ids[]的参数,除了page的参数外,应该在那里找到。
第一页
我们看到第一页没有参数,我们看第二页的请求信息
第二页请求信息
ID有很多,那么我们应该在哪里找到它们呢?我们先来看看第一页的源代码。
第一页的来源信息
看到这些数字,是不是和第二页的参数有关?经过对比,确实和第二页的参数id一致。有了线索,我们再看第三页(进一步确定携带的参数)
第三页参数
经过分析,我们发现第三页的参数是40,第二页是20,第一页是0,第二页的id参数,我们可以在第一页的源码中得到。可以在第二页上看到第三页吗?,我们看一下第二页的源码
可能有*敏*感*词*
因为网页是直接加载的,所以我们大致确定第二页的位置,然后比较第三页的一些参数信息。
第三页部分参数
仔细对比可以发现,第三页的参数确实收录
了第一页和第二页的id信息。
现在差不多我们对这个页面的加载方式和分页方式有了更好的了解,即除了后续每个页面的page参数变化外,携带的seen_snote_ids[]都是前一个(几个)的id参数页,那么这个有多少页?我真的一直点击加载。最终,page参数停留在了15页(seen_snote_ids[]的数量非常多),“read more”字样没有出现。让我们来看看。
第十五页
我们可以看到请求的URL的长度,并且参数一直在增加,所以暂时我认为i是15页。下面是获取 id 和分页 URL 的示例代码:
1.获取id
html = requests.get(url,headers = self.headers,cookies = self.cookies).text
response = etree.HTML(html)
ids = response.xpath('//*[@id="list-container"]/ul/li')
for one in ids:
one = 'seen_snote_ids[]=' + one.xpath('@data-note-id')[0]
2.构造页码
def totalPage(self):
for i in range(1,16):
data = '&'.join(self.params)
url = 'http://www.jianshu.com/?' + data + '&page={}'.format(i)
self.getData(url)
遇到的问题+示例源码
1.遇到的问题
以前是按照我7号的小本子的流行思路写的,最后得到了重复数据,加上id后,也是重复数据。罗罗盘在跑到合适的boss之前给我看了首页分析的文章,看和我对比后,感觉差不多,就是拿不到数据。之后,你们说参数可能不够。LEONYao大哥也说可以把所有参数都放进去,弹到满状态,往右边跑。之后说带cookies是可行的,但是经过测试确实可行(小cookie困扰了很久,没想到带cookies)
2.示例代码
# -*- coding:utf-8 -*-
from lxml import etree
import requests
import re
from Class.store_csv import CSV
class Spider(object):
headers = {
"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
}
cookies = {
'UM_distinctid': '15ac11bdff316-0ce09a4511f531-67f1a39-100200-15ac11bdff447d',
'CNZZDATA1258679142': '1034687255-1492307094-%7C1493259066',
'remember_user_token': 'W1s1MjA4MDY0XSwiJDJhJDEwJFVWVjUwbXBsS1hldkc1d0l3UG5DSmUiLCIxNDk0ODkyNTg0LjczNDM2ODgiXQ%3D%3D--f04b34c274980b45e5f7ee17c2686aeb4b567197',
'_gat': '1',
'_session_id': 'N0tvclN3V09wZ25UNFloZ0NrRTBVT3ZYQUR5VkRlV1c2Tno1bnNZc3dmQm9kQ3hmOGY4a0dFUlVLMDdPYWZJdCsydGJMaENZVU1XSHdZMHozblNhUERqaldYTHNWYXVPd2tISHVCeWJtbUFwMjJxQ3lyU2NZaTNoVUZsblV4Si94N2hRRC94MkJkUjhGNkNCYm1zVmM0R0ZqR2hFSFltZnhEcXVLbG54SlNSQU5lR0dtZ2MxOWlyYWVBMVl1a1lMVkFTYS8yQVF3bGFiR2hMblcweTU5cnR5ZTluTGlZdnFKbUdFWUYzcm9sZFZLOGduWFdnUU9yN3I0OTNZbWMxQ2UvbU5aQnByQmVoMFNjR1NmaDJJSXF6WHBYQXpPQnBVRVJnaVZVQ2xUR1p4MXNUaDhQSE80N1paLzg0amlBdjRxMU15a0JORlB1YXJ4V2g0b3hYZXpjR1NkSHVVdnA2RkgvVkJmdkJzdTg5ODhnUVRCSnN2cnlwRVJvWWc4N0lZMWhCMWNSMktMMWNERktycE0wcHFhTnYyK3ZoSWFSUFQzbkVyMDlXd2d5bz0tLThrdXQ2cFdRTTNaYXFRZm5RNWtYZUE9PQ%3D%3D--bc52e90a4f1d720f4766a5894866b3764c0482dd',
'_ga': 'GA1.2.1781682389.1492310343',
'_gid': 'GA1.2.163793537.1495583991',
'Hm_lvt_0c0e9d9b1e7d617b3e6842e85b9fb068': '1495360310,1495416048,1495516194,1495583956',
'Hm_lpvt_0c0e9d9b1e7d617b3e6842e85b9fb068': '1495583991'
}
params = []
def __init__(self):
field = ['标题', '作者', '发表时间', '阅读量', '评论数', '点赞数', '打赏数', '所投专题']
self.write = CSV('main.csv', field)
def totalPage(self):
for i in range(1,16):
data = '&'.join(self.params)
url = 'http://www.jianshu.com/?' + data + '&page={}'.format(i)
self.getData(url)
def getData(self,url):
print url
html = requests.get(url,headers = self.headers,cookies = self.cookies).text
response = etree.HTML(html)
ids = response.xpath('//*[@id="list-container"]/ul/li')
for one in ids:
one = 'seen_snote_ids[]=' + one.xpath('@data-note-id')[0]
self.params.append(one)
item = {}
flag = 0
read = re.findall(r'ic-list-read"> (\d+)', html)
comment = re.findall(r'ic-list-comments"> (\d+)', html)
result = response.xpath('//*[@id="list-container"]/ul/li/div')
for one in result:
item[1] = one.xpath('a/text()')[0]
item[2] = one.xpath('div[1]/div/a/text()')[0]
item[3] = one.xpath('div[1]/div/span/@data-shared-at')[0]
item[4] = read[flag]
try:
item[5] = comment[flag]
except:
item[5] = u''
item[6] = one.xpath('div[2]/span/text()')[0].strip()
try:
item[7] = one.xpath('div[2]/span[2]/text()')[0].strip()
except:
item[7] = u'0'
try:
item[8] = one.xpath('div[2]/a[1]/text()')[0]
except:
item[8] = u''
flag += 1
row = [item[i] for i in range(1, 9)]
self.write.writeRow(row)
if __name__ == "__main__":
jian = Spider()
jian.totalPage()
结果截图
信息详情
总结
现在想一想,在抓取网站的时候,我们可以携带尽可能多的参数(俗话说,很多人不怪它),以免遇到我的错误。目前正在编写scrapy版本。有兴趣的可以参考私聊源码。