scrapy分页抓取网页( page=4那么我们是不是可以通过,改变页码去完成呢?)

优采云 发布时间: 2021-12-25 17:27

  scrapy分页抓取网页(

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版本。有兴趣的可以参考私聊源码。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线