python,scrapy,爬取不规则

import scrapy
from spider1.items import Spider1Item

class JobSpider(scrapy.Spider):
    name = 'job'
    allowed_domains = ['qidian.com']

    def start_requests(self):
        for next_page in range(1,6):
            url = 'https://www.qidian.com/finish?action=hidden&orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=2&page={0}'.format(
                next_page)
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response, **kwargs):
        items = response.xpath('//div[@class="book-img-text"]/ul/li')
        for item in items:
            a = Spider1Item()
            a['title'] = item.xpath('.//div[@class="book-mid-info"]/h4/a/text()').extract()[0]
            a['author'] = item.xpath('.//div[@class="book-mid-info"]/p[@class="author"]/a/text()').extract()[0]
            yield a

 

这串代码爬取不按照顺序爬取,有什么办法可以让他按顺序爬取。

应该是后台返回的数据就是这个顺序吧。

写个for循环,把url中的page=1改为page={page_num}即可顺序爬取

可以参考我的

# 导入所需库
import requests

class Jdcomment_spider(object):

    # 请求头
    headers = {
        'User-Agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 89.0.4389.90Safari / 537.36'
    #请求的客户端信息
    }

    def __init__(self, file_name='jd_commet'):
        # 实例化类的时候运行初始化函数
        # 打开文件
        self.fp = open(f'./{file_name}.csv', 'w', encoding='utf_8_sig')

        print(f'正在打开文件{file_name}.csv文件!')


    def parse_one_page(self, url):
        # 指定url
        #url='https://club.jd.com/comment/productPageComments.action?productId=100017543968&score=0&sortType=6&page=1&pageSize=10&isShadowSku=100016034372&rid=0&fold=1'
        # print(url)

        # 发起请求
        response = requests.get(url, headers=self.headers)
        # 获取响应
        js_data = response.json()

        # 提取评论列表
        comments_list = js_data['comments']

        for comment in comments_list:
            # 商品id
            #goods_id = comment.get('id')
            # 用户昵称
            #nickname = comment.get('nickname')
            # 评分
            #score = comment.get('score')
            # 商品尺寸
            #productSize = comment.get('productSize')
            # 商品颜色
            #productColor = comment.get('productColor')
            # 评论时间
            #creationTime = comment.get('creationTime')
            # 评论内容
            content = comment.get('content')
            content = ' '.join(content.split('\n'))  # 处理换行符

            print(content)

            # 循环写出数据
            self.fp.write(f'{content}\n')


    def parse_max_page(self):
        for page_num in range(50):  # 抓包获得最大页数
            # 指定通用的url模板
            new_url = f'https://club.jd.com/comment/productPageComments.action?productId=100017543968&score=0&sortType=6&page={page_num}&pageSize=10&isShadowSku=100016034372&rid=0&fold=1'

            print(f'正在获取第{page_num}页')
            # 调用函数
            self.parse_one_page(url=new_url)


    def close_files(self):
        self.fp.close()
        print('爬虫结束,关闭文件!')


if __name__ == '__main__':
    # 创建实例对象
    jd_spider = Jdcomment_spider()
    # 开始爬虫
    jd_spider.parse_max_page()
    # 关闭文件
    jd_spider.close_files()
	

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

关键在于yield,带有 yield 的函数在 Python 中被称之为 generator(生成器),在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。