Scrapy豆瓣搜索页面爬虫使用scrapy爬虫框架爬取豆瓣图书搜索结果ScrapyScrapy是一个为爬取网站数据,提取结构化数据而编写的应用框架。信息处理或历史数据存储等一系列程序为各类爬虫提供基类,如BaseSpider、CrawlSpider等主要组件Scrapy框架主要由五大组件组成。一个URL优先级队列,决定下一个要爬取的URL,同时去除重复的URL。用户可以根据自己的需要自定义调度器。下载器(Downloader)下载器是所有组件中负担最重的。用于高速下载网络上的资源。Scrapy的下载器代码不算太复杂,但是效率很高。主要原因是Scrapy下载器建立在twisted上的爬虫(Spider)爬虫,高效的异步模型,是用户最关心的部分。用户自定义自己的爬虫(通过自定义正则表达式等语法),用于从特定的网页中提取自己需要的信息,即所谓的实体(Item)。用户也可以从中提取链接,让Scrapy继续抓取下一个页面实体管道(ItemPipeline)。实体管道用于处理蜘蛛(spider)提取的实体(Item)。主要功能是持久化实体,验证实体的有效性。Scrapy引擎(ScrapyEngine)Scrapy引擎是整个框架的核心,用于控制调试器、下载器和爬虫。其实引擎就相当于电脑的CPU,控制着整个过程数据流(Dataflow)Scrapy中的数据流是由执行引擎控制的,流程如下:引擎打开一个网站,找到处理网站的Spider,发送给蜘蛛RequestthefirstURL(s)引擎从Spider获取第一个要抓取的URL,并使用Request调度引擎请求下一个要抓取的URL调度器(Scheduler)调度器返回下一个要抓取的URL给引擎,引擎通过下载中间件(请求方向)将URL转发给下载器(Downloader)。页面下载完成后,下载器为页面生成一个Response,通过下载中间件(响应方向)发送给引擎引擎接收到下载器的Response,通过Spider中间件发送给Spider处理(inputdirection)Spider处理Response,返回爬取到的Item和(后续)新的Request到engineengine将爬取到的Item(Spider返回的)发送到ItemPipeline,将Request(Spider返回的)发送到调度程序(从第二步开始)并重复,直到调度程序中没有更多请求,引擎关闭网站。简单的使用CreateItemscrapystartprojectxxx创建一个爬虫scrapygenspiderxxx(爬虫名称)xxx.com(爬虫域名)生成一个文件scrapycrawlxxx-oxxx.json(生成一个json/csv文件)运行一个爬虫scrapycrawlXXXlists所有爬虫scrapylistscrapy项目目录结构通过命令scrapystartprojecttutorialtutorial新建一个项目tutorial会创建一个tutorial目录,内容如下tutorial/scrapy.cfg#项目配置文件tutorial/#在项目的python模块之后,会添加代码here__init__.pyitems.py#项目中的item文件pipelines.py#项目中的pipelines文件settings.py#项目设置文件spiders/#蜘蛛代码放置目录__init__.py...使用scrapy爬取豆瓣搜索页面分析https://search.douban.com/movie/subject_search?search_text={search_text}&cat=1002&start={start}search_textsearchkeywordcatsearchcategorystartstartnumberofitemsurl规则可以应用于图书和电影搜索页面,下面的抓取同理。爬取后发现获取不到页面信息,但是有一个窗口.__DATA__猜测数据已经被加密成这串字符串了。百度了一圈发现有大佬提取了加密后的js代码!所以我直接给了老大的链接。豆瓣图书搜索页面的window.__DATA__解密解决了这个问题。其他人很容易爬取代码。完整代码见从github仓库中提取的js。.Spider):name='douban_book_search'allowed_domains=['douban.com']def__init__(self,keyword=None,start=None,*args,**kwargs):super(DoubanBookSearchSpider,self).__init__(*args,**kwargs)self.keyword=keywordself.start=startself.start_urls.append(f'https://search.douban.com/book/subject_search?search_text={self.keyword}&cat=1001&start={self.start}')defparse(self,response):r=re.search('window.__DATA__="([^"]+)"',response.text).group(1)#导入jsfile_path=pathlib.Path.cwd()/'third_party/main.js'withopen(file_path,'r',encoding='gbk')asf:decrypt_js=f.read()ctx=execjs.compile(decrypt_js)data=ctx.call('decrypt',r)foritemindata['payload']['items']:ifitem.get('rating',None):cover_url=item['cover_url']score=item['rating']['value']score_num=item['rating']['count']url=item['url']abstract=item['abstract']title=item['title']id=item['id']yieldDouBanBookSearchItem(cover_url=cover_url,score=score,score_num=score_num,url=url,abstract=abstract,title=title,id=id)参考爬虫框架Scrapy个人总结(详细)熟悉架构概述Scrapy爬虫框架,入门案例(很详细)window.__DATA__解密豆瓣阅读搜索页
