未分类

何为下载中间件下载器中间件是Scrapy的请求/响应处理的类。这是一个轻量级的低级系统,用于全局更改Scrapy的请求和响应。使用要激活下载程序中间件组件,请将其添加到DOWNLOADER_MIDDLEWARES设置中,这是一个dict,其键为中间件类路径,其值为中间件顺序(权重)#Enableordisabledownloadermiddlewares#Seehttps://docs.scrapy.org/en/latest/topics/downloader-middleware.htmlDOWNLOADER_MIDDLEWARES={'lagouApp.middlewares.LagouappDownloaderMiddleware':543,}将该DOWNLOADER_MIDDLEWARES设置与DOWNLOADER_MIDDLEWARES_BASEScrapy中定义的设置合并(而不是被覆盖),然后按顺序进行排序,以获取启用的中间件的最终排序列表,请求会按照小到大执行,响应会按照大到小执行,其各个中间件权重大小的决定,可参照DOWNLOADER_MIDDLEWARES_BASE设置。如果要禁某个中间件把它设置为None就好。内置下载中间件CookiesMiddleware属于scrapy.downloadermiddlewares.cookies.CookiesMiddleware类使用此中间件,可以处理需要cookie的站点,例如使用会话的站点。它会跟踪Web服务器发送的cookie,并像网络浏览器一样,将其发送回后续请求(来自该蜘蛛)。注意meta.get(‘cookiejar’)不是“粘性”的您需要在后续请求中继续传递它defparse_page(self,response):#dosomeprocessingreturnscrapy.Request("https://bigdataboy.cn",meta={'cookiejar':response.meta['cookiejar']},callback=self.parse_other_page)相关设置COOKIES_ENABLED默认启用cookies#Disablecookies(enabledbydefault)是否启用cookies#COOKIES_ENABLED=TrueCOOKIES_DEBUG如果启用,Scrapy将记录请求中发送的所有cookie(即Cookie标头)和响应中接收的所有cookie(即Set-Cookie标头)。COOKIES_DEBUG=False开启效果2020-01-1420:20:26[scrapy.downloadermiddlewares.cookies]DEBUG:Receivedcookiesfrom:<200https://bigdataboy.cn>Set-Cookie:JSESSIONID=ABAAABAAAEEAAII73F8A39DC3BF1352400CBB34ABA2AB47;Path=/;HttpOnlySet-Cookie:SEARCH_ID=11c20adceed742cd9ed906fe2e0c47ad;Version=1;Max-Age=86400;Expires=Wed,15-Jan-202012:20:28GMT;Path=/Set-Cookie:user_trace_token=20200114202028-23b9b484-6bec-4761-a4ec-4a08c2bae9e9;Max-Age=31536000;Path=/;Domain=.lagou.com;2020-01-1420:20:26[scrapy.core.engine]DEBUG:Crawled(200)<GEThttps://bigdataboy.cn>(referer:None)UserAgentMiddleware属于scrapy.downloadermiddlewares.useragent.UserAgentMiddleware类允许蜘蛛覆盖默认用户代理的中间件。为了使Spider可以覆盖默认用户代理,user_agent必须设置其属性。DefaultHeadersMiddleware属于scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware类该中间件会把setting中指定的所有默认请求标头加入HttpProxyMiddleware属于scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware类该中间件通过设置Request.meta的proxy值来设置代理池和设置Request.headers里的认证头部(Proxy-Authorization)DownloadTimeoutMiddleware属于scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware类该中间件会获取DOWNLOAD_TIMEOUT的值给蜘蛛设置下载的超时时间。还可以给每个Request.meta设置download_timeout属性,单独设置超时时间。HttpAuthMiddleware属于scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware类该中间件使用基本访问身份验证(也称为HTTP身份验证)对从某些蜘蛛生成的所有请求进行身份验证。要启用某些蜘蛛网的HTTP身份验证,请设置这些蜘蛛网的http_user和http_pass属性。fromscrapy.spidersimportCrawlSpiderclassSomeIntranetSiteSpider(CrawlSpider):http_user='someuser'http_pass='somepass'name='bigdataboy.cn'#..restofthespidercodeomitted...HttpCacheMiddleware属于scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware类该中间件为所有HTTP请求和响应提供了低级缓存。它必须与缓存存储后端以及缓存策略结合使用HttpCompressionMiddleware属于scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware类该中间件允许从网站发送/接收压缩(gzip,deflate)流量。如果安装了brotlipy,此中间件还支持解码brotli压缩的响应。相关设置COMPRESSION_ENABLEDCOMPRESSION_ENABLED=TrueRedirectMiddleware属于scrapy.downloadermiddlewares.redirect.RedirectMiddleware类该中间件根据响应状态处理请求的重定向。可以在Request.meta的redirect_urls中找到请求通过的URL(在重定向时)。还可以在Request.meta的redirect_reasons中找到每个重定向的背后原因。例如:。[301,302,307,'metarefresh']相关设置REDIRECT_ENABLED#启用重定向中间件REDIRECT_ENABLED=TrueREDIRECT_MAX_TIMES#单个请求将遵循的最大重定向数。REDIRECT_MAX_TIMES=20RetryMiddleware属于scrapy.downloadermiddlewares.retry.RetryMiddleware类中间件,用于重试失败的请求,这些请求可能是由临时问题(例如连接超时或HTTP500错误)引起的。蜘蛛完成对所有常规(非失败)页面的爬网之后,将在抓取过程中收集失败的页面,并在最后进行重新请求。相关设置RETRY_ENABLED#启用“重试”中间件。RETRY_ENABLED=TrueRETRY_TIMES#除了首次下载外,最大重试次数。RETRY_TIMES=2RETRY_HTTP_CODES#重试哪个HTTP响应代码。RETRY_HTTP_CODES=[500,502,503,504,522,524,408,429]DownloaderStats属于scrapy.downloadermiddlewares.stats.DownloaderStats类中间件,用于存储通过它的所有请求,响应和异常的统计信息。要使用此中间件,必须启用该DOWNLOADER_STATS=True(默认开启)。AjaxCrawlMiddleware属于scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware类基于元片段html标签找到“AJAX可抓取”页面变体的中间件。有关更多信息,请参见https://developers.google.com/webmasters/ajax-crawling/docs/getting-started。

未分类

说明上一个案例,对自带的ImagePipeline写了一个图片下载案例,现在对最后的小结进行改进对图片进行进行自定义名称存储主要涉及ImagePipeline类的继承与方法的重写优化开始优化Wallpaperspider.py文件defparse(self,response):#循环li标签forurltaginresponse.xpath('//ul[@class="clearfix"]/li/a'):#获取图片标题titles=urltag.xpath('./img/@alt').get()#获取图片链接url=urltag.xpath('./img/@src').get()#-->没有http://的链接urls_pic=response.urljoin(url)#拼接URL#传给数据ItemyieldImagesappItem(titles=titles,image_urls=urls_pic)优化pipeline.py文件继承ImagePipeline类导入ImagesPipeline类fromscrapy.pipelines.imagesimportImagesPipeline继承ImagesPipeline类classPicImagesPipeline(ImagesPipeline):pass重写get_media_requests()方法此方法是构造请求的Ruquest对象#构造下载,首先调用的函数defget_media_requests(self,item,info):#导入Request模块fromscrapy.http.requestimportRequest#在item中取出url,再把item给meta参数进行传递#在后面方法中,可以从request对象的meta属性获得item的数据yieldRequest(url=item['image_urls'],meta={'item':item})重写file_path()方法此方法是返回存储的路径deffile_path(self,request,response=None,info=None):#从request对象的meta属性获取titletitle=request.meta['item']['titles']#构造存储路径path=title+'.jpg'returnpath修改settings.py文件因为使用了自定义的Pipeline,所以我们需要指定我们重写的Pipeline#Configureitempipelines#Seehttps://docs.scrapy.org/en/latest/topics/item-pipeline.htmlITEM_PIPELINES={'ImagesApp.pipelines.PicImagesPipeline':1,#继承的重写ImagesPipeline类}运行爬虫scrapycrawlWallPaperSpider

未分类

使用官方提供的PiplineScrapy框架为下载的item中包含的图片提供了一个可以重用的图片下载pipeline。这些pipeline有共同的方法和结构。一般会使用到有FilesPipeline、ImagesPipline。使用官方Pipline的好处避免重新下载最近已经下载的数据方便指定下载的路径方便的转换图片的格式方便生成略缩图方便检测图片的宽高,确保满足最小值异步下载,效率非常高ImagesPipline的使用准备使用ImagesPipline,需要提前下载好Pillow图片处理库当使用ImagesPipline下载图片的时候,按照以下步骤完成1.定义Item属性必须要定义两个个默认的item属性:image_urls:存储下载图片的链,需要传递一个列表。images:文件下载完成后,会把图片的相关信息存储到这个属性里,比如下载的路径、下载的URL、文件的校验码…classMaybachItem(scrapy.Item):image_urls=scrapy.Field()images=scrapy.Field()2.启用ImagesPipline管道在settings.py里开启#Configureitempipelines#Seehttps://docs.scrapy.org/en/latest/topics/item-pipeline.htmlITEM_PIPELINES={#'Maybach.pipelines.MaybachPipeline':300,#开启图片下载器'scrapy.pipelines.images.ImagesPipeline':1,}3.配置ImagesPipline下载路径在settings.py里添加上#ImagesPipline下载路径,可以使用OS模块来指定路径#没有这个路径,会自动创建IMAGES_STORE='路径'0x00创建爬虫工程scrapystartprojectImagesApp(创建Scrapy工程)cdImagesApp(进入工程目录)scrapygenspiderWallPaperSpiderpic.netbian.com(创建爬虫)0x01配置爬虫关闭机器人协议#Obeyrobots.txtrulesROBOTSTXT_OBEY=False设置请求头#Crawlresponsiblybyidentifyingyourself(andyourwebsite)ontheuser-agentUSER_AGENT='Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/76.0.3809.100Safari/537.36'开启ImagesPipline管道#Configureitempipelines#Seehttps://docs.scrapy.org/en/latest/topics/item-pipeline.htmlITEM_PIPELINES={#'ImagesApp.pipelines.ImagesappPipeline':300,(注释掉)'scrapy.pipelines.images.ImagesPipeline':1,}配置图片的下载路径importosIMAGES_STORE=os.path.join(os.path.dirname(os.path.dirname(__file__)),'img')设置Item属性在items.py里classImagesappItem(scrapy.Item):#definethefieldsforyouritemherelike:#name=scrapy.Field()image_urls=scrapy.Field()images=scrapy.Field()0x02编写爬虫程序通过对网页的分析,我们需要的链接在这些li标签下获取图片链接但这些url,没有协议头defparse(self,response):url=response.xpath('//ul[@class="clearfix"]/li/a/img/@src').getall()print(url)添加协议头response.urljoin(url)方法会自动把相应的协议头加上urls_pic=list(map(lambdaurl:response.urljoin(url),urls))把图片链接通过Item传给ImagesPipeline下载导入ImagesappItem,传入url列表,启动爬虫fromImagesApp.itemsimportImagesappItemdefparse(self,response):urls=response.xpath('//ul[@class="clearfix"]/li/a/img/@src').getall()urls_pic=list(map(lambdaurl:response.urljoin(url),urls))yieldImagesappItem(image_urls=urls_pic)#启动爬虫scrapycrawlWallPaperSpider0x03小结这个小案例是直接使用的官方的ImagePipeline下载,所以没有对图片进行重命名,或者分类等操作,需要实现这些操作,就需要继承ImagesPipeline类,然后重新里面的相关方法,可以查看改进版。

未分类

CrawlSpider简介Spider可以做很多爬虫了,但是CrawlSpider是为全站爬取而生创建CrawlSpider爬虫工程scrapystartprojectwxapp创建CrawlSpider爬虫scrapygenspider-tcrawl[爬虫名称][爬取网站的域名]scrapygenspider-tcrawlwxapp_spiderwxapp-union.com修改settings.py设置#设置user-agent#Crawlresponsiblybyidentifyingyourself(andyourwebsite)ontheuser-agentUSER_AGENT=''#关闭机器人协议#Obeyrobots.txtrulesROBOTSTXT_OBEY=False#设置延迟#Configureadelayforrequestsforthesamewebsite(default:0)#Seehttps://docs.scrapy.org/en/latest/topics/settings.html#download-delay#SeealsoautothrottlesettingsanddocsDOWNLOAD_DELAY=1#设置headers#Overridethedefaultrequestheaders:DEFAULT_REQUEST_HEADERS={'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language':'en',}#开启pipelines文件写入#Configureitempipelines#Seehttps://docs.scrapy.org/en/latest/topics/item-pipeline.htmlITEM_PIPELINES={'wxapp.pipelines.WxappPipeline':300,}制定Items传输打开items.pyclassWxappItem(scrapy.Item):#definethefieldsforyouritemherelike:#name=scrapy.Field()#文章标题title=scrapy.Field()#文章内容article=scrapy.Field()编写获取页面和文章链接的规则进入/spiders目录,查看wxapp_spider.py的爬虫类是继承于CrawlSpider类可在rules=()里定义多个Rule()规则Rule()参数详解:LinkExtractor(allow=r’匹配规则’):指定在页面里匹配链接的规则,支持正则表达式callback=’函数名称’:匹配到链接所执行的函数follow=True:爬取了匹配的页面后,是否在匹配页面再进行匹配(可实现翻页操作)name='wxapp_spder'allowed_domains=['www.wxapp-union.com']start_urls=['http://www.wxapp-union.com/portal.php?mod=list&catid=1&page=1']rules=(#设置匹配页数的规则(可以设置多个匹配连接的Rule())Rule(#页数的连接的匹配规则(支持正则表达式)LinkExtractor(allow=r'.+mod=list&catid=1&page=\d+'),#匹配到链接进行解析的函数follow=True),#匹配文章页面链接Rule(#匹配文章链接LinkExtractor(r'http://www.wxapp-union.com/article-(.*)-(.*)\.html'),#匹配到文章链接的解析函数callback='parse_article',follow=False,))添加解析文章页面的函数parse_article()导入fromwxapp.itemsimportWxappItemdefparse_item(self,response):pass#print(response.url)defparse_article(self,response):title=response.xpath('//div[@class="hhmcl"]/div/h1/text()').get()articleList=response.xpath('//td[@id="article_content"]//text()').getall()article="".join(articleList).split()#拼接返回的列表,去除前后空白字符yieldWxappItem(title=title,article=article)存储爬取数据打开pipeline.py文件导入fromscrapy.exportersimportJsonLinesItemExporter模块classWxappPipeline(object):defopen_spider(self,spider)::#以二进制方式打开文件self.ft=open('articleInfo.json','wb')self.exporter=JsonLinesItemExporter(self.ft,ensure_ascii=False,encoding='utf-8')defclose_spider(self,spider):self.ft.close()defprocess_item(self,item,spider):self.exporter.export_item(item)returnitem运行爬虫scrapycrawlwxapp_spider

未分类

0x00创建爬虫工程进入要创建爬虫的文件下,执行下面命令scrapystartprojectbigdataboy0x01创建爬虫项目进入爬虫工程目录,执行命令,创建第一个爬虫scrapygenspiderbigdataboy_spiderbigdataboy.cn0x02设置爬虫打开settings.py文件,取消下面代码的注释#开启pipelines功能#Configureitempipelines#Seehttps://docs.scrapy.org/en/latest/topics/item-pipeline.htmlITEM_PIPELINES={'bigdataboy.pipelines.BigdataboyPipeline':300,}#添加'User-Agent'#Crawlresponsiblybyidentifyingyourself(andyourwebsite)ontheuser-agentUSER_AGENT=''}0x03编写网页的解析打开bigdataboy_spider.py文件有一个defparse(self,response):函数:这个函数的response是Scrapy框架爬取网页的相应返回值,它是一个scrapy.http.response.html.HtmlResponse对象,所以可以使用xpath,css…提取数据#导入item模型frombigdataboy.itemsimportBigdataboyItemdefparse(self,response):#使用xpath解析网页articleUrl=response.xpath('//div[@class="item-desc"]/a/@href').extract()item=BigdataboyItem(url=articleUrl)#使用定义的item定义的传输参数进行传递yielditem#获取下一页的连接nextUrl=response.xpath('//*[@id="pagenavi"]/div/ol//*[@class="next"]/a/@href').get()#print(nextUrl)ifnextUrl:#传入连接,然后执行的函数yieldscrapy.Request(nextUrl)else:return0x04定义item模型打开items.py文件classBigdataboyItem(scrapy.Item):#definethefieldsforyouritemherelike:#name=scrapy.Field()url=scrapy.Field()#自定义的模型0x05导出数据打开pipeline.py文件fromscrapy.exportersimportJsonItemExporterclassBigdataboyPipeline(object):def__init__(self):self.openFile=open("url.json","wb")#需要使用二进制打开文件,因为在导出过程中是使用的[字节]方式#传入文件打开对象self.exporter=JsonItemExporter(self.openFile)#准备导出self.exporter.start_exporting()#爬虫开始执行调用这个函数defopen_spider(self,spider):print("爬虫开始执行")defprocess_item(self,item,spider):#导出数据self.exporter.export_item(item)returnitem#爬虫执行结束调用这个函数defclose_spider(self,spider):#完成导出self.exporter.finish_exporting()#关闭文件打开self.openFile.close()print("爬虫执行完成")0x06运行爬虫执行命令在Pycharm的Terminal里执行scrapycrawlbigdataboy_spider查看运行结果

未分类

项目背景我们可以通过爬虫来模拟登录来查询自己的成绩,这其中最重要的就是登录这个关卡,只要通过了,就可以方便的查询自己的成绩了。但是我们还是要在法律的允许条件下爬取数据,下列的代码已进行隐私处理,并不针对任何组织。爬虫分析通过抓包,发现登录需要提交学号、密码、验证码、VIEWSTATE通过分析发现其中的VIEWSTATE参数就在网页中,所以我们可以通过正则表达式匹配出来爬虫项目结构importreimportrequestsclassAPI(object):...classTool(object):...API类·通过抓包,知道了以下接口classAPI(object):#登录页GET_INDEX="http://XXXXXXXX:XXXX/"#获取验证码GET_YZM_URL='http://XXXXXXXX:XXXX/CheckCode.aspx'#登录POST_LOGIN='http://XXXXXXXX:XXXX/default2.aspx'Tool类classTool(object):session=requests.session()VIEWSTATE=""#获取VIEWSTATE参数@classmethoddefgetHtml(cls):response=cls.session.get(API.GET_INDEX).textcls.VIEWSTATE=re.search(r'__VIEWSTATE"value="(.*?)"/>',response).group(1)#下载验证码在当前路径@classmethoddefdownload_yzm(cls):yzm_image=cls.session.get(url=API.GET_YZM_URL)withopen("yzm.jpg",'wb')asfile:file.write(yzm_image.content)#登录方法@classmethoddeflogin(cls,account,pwd,yzm):data={"__VIEWSTATE":cls.VIEWSTATE,"TextBox1":account,"TextBox2":pwd,"TextBox3":yzm,"RadioButtonList1":"%D1%A7%C9%FA","Button1":"",}response=cls.session.post(url=API.POST_LOGIN,data=data)response.encoding=response.apparent_encodingresponse=response.texttry:message=re.search(r">alert\('(.*?)'\);</script>",response).group(1)except:#登录成功跳转到详情页xm=re.search(r'<spanid="xhxm">(.*?)同学</span>',response).group(1)print("欢迎"+xm+"登录成功")else:#打印出登录失败信息print(message)主函数defmain():t=Tool()#实例化类t.getHtml()#获取VIEWSTATEt.download_yzm()#下载验证码account=input("请输入你的学号:")pwd=input("请输入你的密码:")yzm=input("请输入验证码:")t.login(account,pwd,yzm)#运行登录方法