首页 > 编程语言 >【Python爬虫】Scrapy框架处理分页爬取+cookie登录_17k小说网

【Python爬虫】Scrapy框架处理分页爬取+cookie登录_17k小说网

时间:2023-12-14 10:12:43浏览次数:26  
标签:17k Python 22% 爬取 url cookie xiaoshuo self

简介

本文主要讲常规分页爬取与利用Scrapy框架怎么快捷的爬取分页的数据以及cookie登录,案例网站时17k小说网,url是https://www.17k.com/

  • 常规分页爬取
  • Scrapy框架分页爬取
  • cookie登录

分页

常规分页爬取

常规分页爬取,直接观察页面数据,一共有多少页数据,就for循环多少次

class Xiaoshuo17ptSpider(scrapy.Spider):
    name = "xiaoshuo17pt"
    allowed_domains = ["17k.com"]
    start_urls = ["https://www.17k.com/all/book/2_0_0_0_0_0_0_0_1.html"]

    def start_requests(self):

        for i in range(1,6):
            url=f'https://www.17k.com/all/book/2_0_0_0_0_0_0_0_{i}.html'
            yield Request(url,meta={"i":i})
    def parse(self, response,**kwargs):
        trs =response.xpath("//table/tbody/tr")
        for tr in trs:
            xiaoshuo_type = tr.xpath("./td[@class='td2']/a/text()").extract()
            if len(xiaoshuo_type ) > 0:
                xiaoshuo_type =xiaoshuo_type[0]
            else:
                continue

            xiaoshuo_name = tr.xpath("./td[@class='td3']//a/text()").extract()
            if len(xiaoshuo_type ) > 0:
                xiaoshuo_name = xiaoshuo_name[0]
            else:
                continue
            print(f"小说类别:{xiaoshuo_type},小说名称:{xiaoshuo_name}")
        print(f"==============>爬取第{response.meta['i']}页数据结束")

Scrapy分页爬取

class Xiaoshuo17scSpider(scrapy.Spider):
    name = "xiaoshuo17sc"
    allowed_domains = ["17k.com"]
    start_urls = ["https://www.17k.com/all/book/2_0_0_0_0_0_0_0_1.html"]

    def parse(self, response):
        fenye_urls = response.xpath('//div[@class="page"]//@href').extract()
        for fenye_url in fenye_urls:
            if fenye_url.startswith("javascript"):
                continue
            else:
                fenye_url = response.urljoin(fenye_url)
                """
                print(fenye_url) #在当前URL中会有很多重复的URL,
                调用Request对象的时候scrapy调度器中通过集合过滤掉了重复项
                """
                yield scrapy.Request(fenye_url,callback=self.parse)

cookie登录

复制粘贴cookie

def start_requests(self):
        # 直接从浏览器复制
        cookies = "GUID=bbb5f65a-2fa2-40a0-ac87-49840eae4ad1; c_channel=0; c_csc=web; Hm_lvt_9793f42b498361373512340937deb2a0=1627572532,1627711457,1627898858,1628144975; accessToken=avatarUrl%3Dhttps%253A%252F%252Fcdn.static.17k.com%252Fuser%252Favatar%252F16%252F16%252F64%252F75836416.jpg-88x88%253Fv%253D1610625030000%26id%3D75836416%26nickname%3D%25E5%25AD%25A4%25E9%25AD%2582%25E9%2587%258E%25E9%25AC%25BCsb%26e%3D1643697376%26s%3D73f8877e452e744c; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2275836416%22%2C%22%24device_id%22%3A%2217700ba9c71257-035a42ce449776-326d7006-2073600-17700ba9c728de%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_referrer_host%22%3A%22%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%7D%2C%22first_id%22%3A%22bbb5f65a-2fa2-40a0-ac87-49840eae4ad1%22%7D; Hm_lpvt_9793f42b498361373512340937deb2a0=1628145672"
        cookie_dic = {}
        for c in cookies.split("; "):
            k, v = c.split("=")
            cookie_dic[k] = v

        yield Request(
            url=LoginSpider.start_urls[0],
            cookies=cookie_dic,
            callback=self.parse
        )

这种方案和原来的requests几乎一模一样. 需要注意的是: cookie需要通过cookies参数进行传递!

直接登录获取cookie

def start_requests(self):
        # 登录流程
        username = "18614075987"
        password = "q6035945"
        url = "https://passport.17k.com/ck/user/login"
		
        # 发送post请求
        # yield Request(
        #     url=url,
        #     method="post",
        #     body="loginName=18614075987&password=q6035945",
        #     callback=self.parse
        # )
        
        # 发送post请求
        yield FormRequest(
            url=url,
            formdata={
                "loginName": username,
                "password": password
            },
            callback=self.parse
        )
	
    def parse(self, response):
        # 得到响应结果. 直接请求到默认的start_urls
        yield Request(
            url=LoginSpider.start_urls[0],
            callback=self.parse_detail
        )

    def parse_detail(self, resp):
        print(resp.text)

​ 注意, 发送post请求有两个方案,

  1. Scrapy.Request(url=url, method='post', body=数据)

  2. Scarpy.FormRequest(url=url, formdata=数据) -> 推荐

在settings文件中给出cookie值.

在settings中.有一个配置项: DEFAULT_REQUEST_HEADERS, 在里面可以给出默认的请求头信息. 但是要注意, 需要在settings中把COOKIES_ENABLED设置成False. 否则, 在下载器中间件中, 会被干掉.

COOKIES_ENABLED = False

DEFAULT_REQUEST_HEADERS = {
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'en',
  'Cookie': 'xxxxxx',
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36"
}

标签:17k,Python,22%,爬取,url,cookie,xiaoshuo,self
From: https://www.cnblogs.com/fuchangjiang/p/17900547.html

相关文章

  • 12.14——python类
    classEmployee:  up=0.1    def__init__(self,name,salary):    #构造器__init__    self.username=name#实例变量    self.salary=salary1          defup_salary(self):#self表示......
  • 使用Python和Qt6(PySide6)创建GUI应用1简介
    1简介在本书从GUI开发的基本原理逐步过渡到使用PySide6创建您自己的、功能齐全的桌面应用程序。1.1GUI简史图形用户界面(GUIGraphicalUserInterface)历史悠久,可追溯到20世纪60年代。斯坦福大学的NLS(ON-Line系统引入了鼠标和窗口概念,并于1968年首次公开展示。随后,施乐公司......
  • python 将 .pdf 文件转为 .md
    方法一:工具网站https://pdf2md.morethan.io/方法二:代码手动转换pipinstallaspose-wordsdoc=aw.Document(r"pdf文件路径\xxx.pdf")doc.save("Output.md")来源:https://products.aspose.com/words/zh/python-net/conversion/—————————————......
  • python之tkinter的grid布局
    grid将界面划分为二维网格,由行和列分割,从上到下,左到右编号,最左上角是(0,0),依次类推。也可结合frame使用,形成更加复杂的界面。语法:grid(argus……)参数:参数属性举例或备注                             row定位组件在第几行 column定位组件在第几列......
  • 使用java调用Python脚本
    通过使用java中的ProcessBuilder类,可以实现在java代码中调用外部的python代码的功能,以下为具体代码:importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;publicclassJavaCallPython{publicstaticvoidmain(String[]args)......
  • Python Numpy 数据可视化
    ​ 1、安装MatplotlibMatplotlib是一个功能强大且受欢迎的Python库,用于生成2D图表和图形。它因其灵活性、广泛的功能和用户友好的界面而广泛用于各种科学、工程和数据分析应用。可以通过pip安装,命令如下,pipinstallmatplotlib或python3-mpipinstallmatplotl......
  • python 的 多个异步库如何兼容
    概述异步编程的重要性和不同的异步库介绍异步编程是现代软件开发中的重要概念,特别是在处理IO密集型任务时,它的作用尤为明显。不同的异步库为Python提供了多种不同的方式来实现异步编程。这些异步库包括但不限于asyncio、tornado、gevent等等。在本文中,我们将介绍这些不同的异步库及......
  • python学习笔记1(你好,python)
    虽然一直不会python,但也了解一些python的场景,比如爬取数据、数据挖掘、ai,今天开始从B站上系统学习一下今日学习笔记:1、python优点:易于读写和学习,英文描述方式专注于解决问题,代码少、有生产力易调试,解释型语言,只显示第一个错误开源免费,标准库很强大,社区也很强大2、缺点:内存占用率高,......
  • Python 潮流周刊第一季完结(1~30)
    你好,我是猫哥。庆祝Python潮流周刊在几天前顺利更新到了第30期!我觉得这是一个很有意义的时间节点,不太短也不漫长,很适合作一个小小的总结。我打算今后每30期作为一季,都给大家做一些总结和分享。首先,给大家公开一些数据吧。本季时间从2023.05.13到2023.12.09,共210天......
  • Python——第五章:Zipfile模块
    Zipfile模块zipfile模块是Python中用于处理ZIP文件的标准库模块。它提供了创建、读取和写入ZIP文件的功能。zipfile模块在写入文件时,如果要将文件写入子目录,需要在写入文件前先创建好相应的目录结构。创建压缩包在使用zipfile.ZipFile写入模式(mode="w")时,如果指......