当前位置: 首页 > news >正文

asp.net小型网站开发wordpress xml 导入失败

asp.net小型网站开发,wordpress xml 导入失败,建设网站一般多钱,邢台哪里有做网站的scrapy爬虫框架 一、scrapy的概念作用和工作流程1、scrapy的概念2、scrapy框架的作用3、scrapy的工作流程#xff08;重点#xff09;3.1 回顾之前的爬虫流程3.2 改写上述流程3.3 scrapy的流程3.4 scrapy的三个内置对象3.5 scrapy中每个模块的具体作用 二、scrapy的入门使用1… scrapy爬虫框架 一、scrapy的概念作用和工作流程1、scrapy的概念2、scrapy框架的作用3、scrapy的工作流程重点3.1 回顾之前的爬虫流程3.2 改写上述流程3.3 scrapy的流程3.4 scrapy的三个内置对象3.5 scrapy中每个模块的具体作用 二、scrapy的入门使用1、安装scrapy2、scrapy项目开发流程3、创建项目4、创建爬虫5、完善爬虫5.1 在/spiders/itcast.py中修改内容5.2 定位元素以及提取数据、属性值的方法5.3 response响应对象的常用属性 6、保存数据6.1 在pipelines.py文件中定义对数据的操作6.2 在settings.py配置启用管道 7、运行scrapy 三、scrapy数据建模与请求1、数据建模1.1 为什么要建模1.2 如何建模1.3 如何使用模板类 2、翻页请求的思路3、构造Request对象并发送请求3.1 实现方法3.2 网易招聘爬虫案例3.3 代码实现3.4 scrapy.Request的更多参数 4、meta参数的使用 四、scrapy模拟登录1、模拟登录的方法1.1 requests的模拟登录1.2 selenium的模拟登录1.3 scrapy的模拟登录 2、scrapy携带cookies直接获取需要登录后的页面2.1 实现重构scrapy的start_requests方法2.2 携带cookies登录GitHub 3、scrapy.Request发送post请求3.1 发送post请求3.1.1 思路分析3.1.1 代码实现 五、scrapy管道的使用1、pipeline 中常用的方法2、管道文件的修改3、开启管道4、pipeline使用注意点 六、scrapy中间件的使用1、scrapy中间件的分类和作用1.1 scrapy中间件的分类1.2 scrapy中间件的作用 2、下载中间件的使用方法3、定义实现随机User-Agent的下载中间件3.1 在settings.py中添加UA列表3.2 在middleware.py中完善代码3.3 在settings中设置开启自定义的下载中间件设置方法同管道 4、代理IP的使用4.1 思路分析4.2 具体实现4.3 检测代理IP是否可用 5、在中间件中使用selenium 七、scrapy_redis的概念、作用及流程1、分布式是什么2、scrapy_redis的概念3、scrapy_redis的作用4、scrapy_redis的工作流程4.1 回顾scrapy流程4.2 scrapy_redis的流程 一、scrapy的概念作用和工作流程 1、scrapy的概念 scrapy是一个python编写的开源网络爬虫框架。它是一个被设计用于爬虫网络数据、提取结构性数据的框架。 scrapy使用了twisted异步网络框架可以加快我们的下载速度。 scrapy文档地址https://scrapy-chs.readthedocs.io/zh-cn/0.24/intro/overview.html 2、scrapy框架的作用 少量的代码就能够快速的抓取 3、scrapy的工作流程重点 3.1 回顾之前的爬虫流程 3.2 改写上述流程 3.3 scrapy的流程 其流程可以描述为 爬虫中的起始url构造成request对象→爬虫中间件→引擎→调度器调度器把request→引擎→下载中间件→下载器下载器发送请求获取response响应→下载中间件→引擎→爬虫中间件→爬虫爬虫提取url地址组装成request对象→爬虫中间件→引擎→调度器重复步骤2爬虫提取数据→引擎→管道处理和保存数据 注意 图中中文是为了方便理解后加上去图中绿色线条表示数据的传递注意图中中间件的位置决定了其作用注意其中引擎的位置所有模块之间相互独立只和引擎进行交互 3.4 scrapy的三个内置对象 request请求对象由url、method、post_data、headers等构成response响应对象由url、body、status、headers等构成item数据对象本质是个字典 3.5 scrapy中每个模块的具体作用 模块作用其他Scrapy Engine引擎总指挥负责数据和信号在不同模块之间的传递scrapy已经实现Scheduler调度器一个队列存放引擎发过来的request请求scrapy已经实现Downloader下载器下载引擎发过来的request请求并返回给引擎scrapy已经实现Spider爬虫处理引擎发来的response提取数据提取url并交给引擎需要手写Item Pipeline管道处理引擎传过来的数据比如存储需要手写Downloader Middlewares下载中间件可以自定义的下载扩展比如设置代理一般不用手写Spider Middlewares爬虫中间件可以自定义request请求和进行response过滤一般不用手写 注意 爬虫中间件和下载中间件只是运行逻辑的位置不同作用是重复的如替换UA等。 二、scrapy的入门使用 1、安装scrapy 命令sudo apt-get install scrapy 或者 pip/pip3 install scrapy 2、scrapy项目开发流程 创建项目scrapy startproject mySpider生成爬虫scrapy genspider itcast itcast.cn提取数据根据网站结构在spider中实现数据采集相关内容保存数据使用pipeline进行数据后续处理和保存 3、创建项目 创建scrapy项目的命令scrapy startproject 项目名称 示例scrapy startproject myspider 生成的目录和文件结果如下 4、创建爬虫 在项目路径下执行如下命令scrapy genspider 爬虫名字 允许爬取的域名 爬虫名字作为爬虫运行时的参数 允许爬取的域名设置爬虫的爬取范围设置之后用于过滤要爬取的url如果爬取的url与允许的域不同则会被过滤掉。 示例 cd myspider scrapy genspider itcast itcast.cn 生成的目录和文件结果如下 5、完善爬虫 在上一步生成出来的爬虫文件中编写指定网站的数据采集操作实现数据提取 5.1 在/spiders/itcast.py中修改内容 import scrapyclass ItcastSpider(scrapy.Spider): # 继承scrapy.Spidername itcast # 爬虫名字allowed_domains [itcast.cn] # 允许爬取的范围start_urls [https://www.itheima.com/teacher.html#ajavaee] # 开始爬取的url地址# 数据提取的方法接收下载中间件传过来的responsedef parse(self, response):# 获取所有老师节点node_list response.xpath(//div[classli_txt])# 遍历老师节点列表for node in node_list:temp {}# xpath方法返回的是选择器对象列表,extract()用于从选择器对象中提取数据temp[name] node.xpath(./h3/text())[0].extract()temp[title] node.xpath(./h4/text())[0].extract()temp[desc] node.xpath(./p/text())[0].extract()yield temp注意 scrapy.Spider爬虫类中必须有名为parse的解析如果网站结构层次比较复杂也可以自定义其他解析函数在解析函数中提取的url地址如果要发送请求则必须属于allowed_domains范围内但是start_urls中的url地址不受这个限制启动爬虫时要注意启动的位置在项目路径下启动parse()函数中使用yield返回数据注意解析函数中的yield能够传递的对象只能是BaseItemRequestdictNone 5.2 定位元素以及提取数据、属性值的方法 解析并获取scrapy爬虫中的数据利用xpath规则字符串进行定位和提取 response.xpath方法的返回结果是一个类似list的类型其中包含的是selector对象操作和列表一样但是有一些额外的方法额外方法extract()返回一个包含有字符串的列表额外方法extract_first()返回列表中的第一个字符串列表为空则返回None 5.3 response响应对象的常用属性 response.url当前响应的url地址response.request.url当前响应对应的请求的url地址response.headers响应头response.request.headers当前响应的请求头response.body响应体也就是html代码byte类型response.status响应状态码 6、保存数据 利用管道pipeline来处理保存数据 6.1 在pipelines.py文件中定义对数据的操作 定义一个管道类重写管道类的process_item方法process_item方法处理完item之后必须返回给引擎 import jsonclass MyspiderPipeline:def __init__(self):self.file open(itcast.json, w)def process_item(self, item, spider):# 将字典数据序列化json_data json.dumps(item, ensure_asciiFalse) ,\n# 将数据写入文件self.file.write(json_data)# 默认使用完管道之后需要将数据返回给引擎return itemdef __del__(self):self.file.close() 6.2 在settings.py配置启用管道 ITEM_PIPELINES {myspider.pipelines.MyspiderPipeline: 300, }配置项中键为使用的管道类管道类使用.进行分割第一个为项目目录第二个为文件第三个为定义的管道类。 配置项中值为管道的使用顺序设置的数值越小越优先执行该值一般设置为1000以内。 7、运行scrapy 命令在项目目录下执行scrapy crawl 爬虫名字 示例scrapy crawl itcast 三、scrapy数据建模与请求 1、数据建模 通常在做项目的过程中在items.py中进行数据建模 1.1 为什么要建模 定义item即提前规划好哪些字段需要抓防止手误定义好之后在运行过程中系统会自动检查配合注释一起可以清晰的知道要抓取哪些字段没有定义的字段不能抓取在目标字段少的时候可以使用字典代替使用scrapy的一些特定组件需要Item做支持如scrapy的ImagesPipeline管道类。 1.2 如何建模 在items.py文件中定义要提取的字段 class MyspiderItem(scrapy.Item):# define the fields for your item here like:name scrapy.Field() # 讲师的名字title scrapy.Field() # 讲师的职称desc scrapy.Field() # 讲师的介绍1.3 如何使用模板类 模板类定义以后需要在爬虫中导入并且实例化之后的使用方法和使用字典相同 itcast.py import scrapy from myspider.items import MyspiderItemclass ItcastSpider(scrapy.Spider): # 继承scrapy.Spidername itcast # 爬虫名字allowed_domains [itcast.cn] # 允许爬取的范围start_urls [https://www.itheima.com/teacher.html#ajavaee] # 开始爬取的url地址# 数据提取的方法接收下载中间件传过来的responsedef parse(self, response):# 获取所有老师节点node_list response.xpath(//div[classli_txt])# 遍历老师节点列表for node in node_list:item MyspiderItem() # 实例化后直接使用# xpath方法返回的是选择器对象列表,extract()用于从选择器对象中提取数据item[name] node.xpath(./h3/text())[0].extract()item[title] node.xpath(./h4/text())[0].extract()item[desc] node.xpath(./p/text())[0].extract()yield item 注意 from myspider.items import MyspiderItem这一行代码中注意item的正确导入路径忽略pycharm标记的错误python中的导入路径要诀从哪里开始运行就从哪里开始导入 2、翻页请求的思路 对于要提取如下图中所有页面上的数据该怎么办 requests模块是如何实现翻页请求的 找到下一页的url地址调用requests.get(url) scrapy实现翻页的思路 找到下一页的url地址构造url地址的请求对象传递给引擎 3、构造Request对象并发送请求 3.1 实现方法 确定url地址构造请求scrapy.Request(url, callback) callback指定解析函数名称表示该请求返回的响应使用哪一个函数进行解析 把请求交给引擎yield scrapy.Request(url, callback) 3.2 网易招聘爬虫案例 通过爬取网易社会招聘的页面的招聘信息学习如何实现翻页请求地址https://hr.163.com/job-list.html 思路分析 获取首页的数据寻找下一页的地址进行翻页获取数据 注意 可以在settings中设置ROBOTS协议 # False表示忽略网站的robots.txt协议默认为True ROBOTSTXT_OBEY False可以在settings中设置User-Agent: # scrapy发送的每一个请求的默认UA都是设置的这个User-Agent USER_AGENT Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.33.3 代码实现 网易社会招聘网站是一个JSON数据渲染的动态网页网页源码中并不包含数据所以不能使用xpath进行解析对网站进行分析找到请求页面动态加载JSON数据的请求如下图所示 图中包含了每个职位的相关信息此时的start_url地址发生了变化需要进行更改请求的方式为POST请求相关的参数如下 该网站存在翻页需要进行模拟翻页请求 将爬取到的数据存储到JSON文件中 代码如下 items.py # Define here the models for your scraped items import scrapyclass WangyiItem(scrapy.Item):name scrapy.Field() # 职位名称workType scrapy.Field() # 工作性质workPlaceNameList scrapy.Field() # 工作地点productName scrapy.Field() # 所属产品firstPostTypeName scrapy.Field() # 职位类别recruitNum scrapy.Field() # 招聘人数reqEducationName scrapy.Field() # 学历reqWorkYearsName scrapy.Field() # 工作经验description scrapy.Field() # 职位描述requirement scrapy.Field() # 职位要求updateTime scrapy.Field() # 更新时间 job.py import jsonimport scrapyfrom wangyi.items import WangyiItem from datetime import datetimenext_page 1 # 用来控制翻页的变量class JobSpider(scrapy.Spider):name joballowed_domains [hr.163.com]# start_urls [https://hr.163.com/job-list.html]start_urls [https://hr.163.com/api/hr163/position/queryPage]def start_requests(self):url self.start_urls[0]# 起始url参数payload {currentPage: 1,pageSize: 10}# 构建post请求yield scrapy.Request(urlurl,bodyjson.dumps(payload),methodPOST,callbackself.parse,headers{Content-Type: application/json;charsetutf-8})def parse(self, response):dic response.json()job_list dic[data][list]item WangyiItem()for job in job_list:item[name] job[name].replace(u\xa0, u )item[workType] job[workType]item[workPlaceNameList] str(job[workPlaceNameList]).replace([, ).replace(], ).replace(, )item[productName] job[productName]item[firstPostTypeName] job[firstPostTypeName]item[recruitNum] job[recruitNum]item[reqEducationName] job[reqEducationName]item[reqWorkYearsName] job[reqWorkYearsName]item[description] job[description].replace(\t, ).replace(\n, ).replace(\\, /)\.replace(u\xa0, u )item[requirement] job[requirement].replace(\t, ).replace(\n, ).replace(u\xa0, u )item[updateTime] datetime.utcfromtimestamp(job[updateTime] / 1000).strftime(%Y-%m-%d)yield item# 模拟翻页page_stutas dic[data][lastPage] # 根据返回的数据来判断是否是最后一页true为最后一页global next_pagenext_page next_page 1if not page_stutas:print(正在爬取第{}页···········.format(next_page))payload {currentPage: {}.format(next_page),pageSize: 10}url self.start_urls[0]yield scrapy.Request(urlurl,bodyjson.dumps(payload),methodPOST,callbackself.parse,headers{Content-Type: application/json;charsetutf-8}) pipelines.py # Define your item pipelines here import jsonclass WangyiPipeline:def __init__(self):self.file open(wangyi.json, w, encodingutf-8)def process_item(self, item, spider):# 将item对象强转为字典该操作只能在scrapy中使用item dict(item)# 将字典数据序列化json_data json.dumps(item, ensure_asciiFalse) ,\n# 将数据写入文件self.file.write(json_data)# 默认使用完管道之后需要将数据返回给引擎return itemdef __del__(self):self.file.close() 最终结果 3.4 scrapy.Request的更多参数 scrapy.Request(url[, callback, methodGET, headers, body, cookies, meta, dont_filterFalse])参数解释 中括号里的参数为可选参数callback表示当前的url的响应交给哪个函数去处理meta实现数据在不同的解析函数中传递meta默认带有部分数据比如下载延迟请求深度等dont_filter默认为False会过滤请求的url地址即请求过的url地址不会继续被请求对需要重复请求的url地址可以把它设置成True比如贴吧的翻页请求页面的数据总是在变化start_urls中的地址会被反复请求否则程序不会启动method指定POST或GET请求header接收一个字典其中不包括cookiecookies接收一个字典专门放置cookiebody接收json字符串为POST的数据发送payload_post请求时使用 4、meta参数的使用 meta的作用meta可以实现数据在不同解析函数中的传递 在爬虫文件的parse方法中提取详情页增加之前callback指定的parse_detail函数 def parse(self, response):...yield scrapy.Request(url detail_url,callback self.parse_detail,meta {item: item})def parse_detail(self, response):# 获取之前传入的itemitem response.meta[item]注意 meta参数是一个字典meta字典中有一个固定的键proxy表示代理IP 四、scrapy模拟登录 1、模拟登录的方法 1.1 requests的模拟登录 直接携带cookies请求页面找url地址发送post请求存储cookies 1.2 selenium的模拟登录 找到对应的input标签输入文本点击登录 1.3 scrapy的模拟登录 直接携带cookies找url地址发送post请求存储cookie 2、scrapy携带cookies直接获取需要登录后的页面 应用场景 cookie过期时间很长常用于一些不规范的网站能在cookie过期前把所有的数据拿到配合其他程序使用比如其使用selenium把登录之后的cookie获取保存到本地scrapy发送请求之前先读取本地cookie 2.1 实现重构scrapy的start_requests方法 scrapy中start_url是通过start_request来进行处理的其实现代码如下 def start_requests(self):cls self.__class__if not self.start_urls and hasattr(self, start_url):raise AttributeError(Crawling could not start: start_urls not found or empty (but found start_url attribute instead, did you miss an s?))if method_is_overridden(cls, Spider, make_requests_from_url):warnings.warn(Spider.make_requests_from_url method is deprecated; it wont be called in future Scrapy releases. Please override Spider.start_requests method instead f(see {cls.__module__}.{cls.__name__}).,)for url in self.start_urls:yield self.make_requests_from_url(url)else:for url in self.start_urls:yield Request(url, dont_filterTrue)所以对应的如果start_url地址中的url是需要登录后才能访问的url地址则需要重写start_request方法并在其中手动添加上cookie 2.2 携带cookies登录GitHub import scrapyclass Git1Spider(scrapy.Spider):name git1allowed_domains [github.com]start_urls [https://github.com/yixinchd]def start_requests(self):url self.start_urls[0]temp _octoGH1.1.1704635908.1695371613; preferred_color_modedark; tzAsia%2FShanghai; _device_ide0e107d487355d28e612363acb5a1896; has_recent_activity1; saved_user_sessions102498110%3AVR4xKz7HlrvOYXtBGIYS5ymlBh60jLTs5ZluskQ1quEy_SHy; user_sessionVR4xKz7HlrvOYXtBGIYS5ymlBh60jLTs5ZluskQ1quEy_SHy; __Host-user_session_same_siteVR4xKz7HlrvOYXtBGIYS5ymlBh60jLTs5ZluskQ1quEy_SHy; tzAsia%2FShanghai; color_mode%7B%22color_mode%22%3A%22light%22%2C%22light_theme%22%3A%7B%22name%22%3A%22light_high_contrast%22%2C%22color_mode%22%3A%22light%22%7D%2C%22dark_theme%22%3A%7B%22name%22%3A%22dark%22%2C%22color_mode%22%3A%22dark%22%7D%7D; logged_inyes; dotcom_useryixinchd; _gh_sessqO24Aua93K95viiLT3FeWsEqiAZRqjuIA%2BBJMmnRsaEKwiXYC8MJZF1nXni%2Fvt0bLRxwXadmjsHsbIuFTfLx6EwdGuQVjAdC0b88nq7w%2Bo7eOZYspcKxyqn5QoHYOiKFkPG8up6y7jwLwWgdZawMWndiK3OvlHO4rYccMttUcRUgmWY%2Fqlc1y8PgGDbuphe0aUY2agmZjxsm4DUmOCOZrnQybBXefybehb8Y5yql5A%2BWKNYES1dIDd9wToPmjYhf%2Fg0Y3rn0Vd%2Fi%2FIW%2Fj%2BfDCpv3BB4NY2zBBR3B3LSrRzYMNvOQFBM1SsL2vaoQSRg5kt6OpQfpkZZ7LZLZn0dmBoGNOrV66efLO4cSq8VXoUqPafbz%2B%2BFGx6NbgR0bFBkSDuHuTf%2FqFKb0io6d2LqcASJgIU6aOqSR2TDPsdob25leBzErM1mVwTN7sTq36CD5Fypr%2Fyuj8Ofu6HA%2FJ7oDss1UUAl%2Bh5G8C8I%2F1zcZKEkr5mlyL4LbZdteBqLfBE2PQp%2B1l%2BdZBLKkTbBrUTc%2BB1IFupsDIocOh5gx0%2BszdegRieG3RNn%2BfuqaxOsbRbWGNI%2F7pVgdswp%2F67PI6NT6SbnXwDRccZO63f8k3hAc26Az%2B5JmXf%2B5XWkgcf8hGWUL3eWJAOn7HXjUp7bCERsD%2BxEZH%2FRQDv8EozZKpGi3AWyL4uJYfondySe6kOARef0Vr%2Fe0AoFBakLmrEkvv7nI9BpbYDCj5zuV1ItPkDxPy%2BpOPzFbbZGEOx8dkKQenNFj0LzG1VSUGa5ZyYxwXdTu%2FwxouF4mgi%2Bp1c0Jl60BYuidKo0izfVH3giU4VZG6wzDi1QU66UapA5UzsixdTJJL8gQ0uPst1NUdvocY%2FToIyGwntGoPR3NYlCm9Jx2uE2WaKCJ1S8ahcyX5sV95t4ioEm%2FSrsuwrjBSbohk2mB%2B81xAPR4qBDURwpVwXSXt0LYvl5CIJUL%2BUnZd17%2BvvOTwpfY0e5uS3u2vOUVwgdD9dI2ZU3MFqURgjHjz15gSfSqZdb64Q%3D%3D--Fdopx2y%2BDKwpM9rj--Yn7THwpkvt8r67w5NaoDFQ%3D%3Dcookies {data.split()[0]: data.split()[-1] for data in temp.split(; )}yield scrapy.Request(urlurl,callbackself.parse,cookiescookies)def parse(self, response):print(response.xpath(/html/head/title/text()).extract_first()) 注意 scrapy中cookie不能放在headers中在构造请求的时候有专门的cookies参数能够接收字典形式的cookie在setting中设置Robots协议、User_Agent 3、scrapy.Request发送post请求 可以通过scrapy.Request()指定method、body参数来发送post请求但通常使用scrapy.FormRequest()来发送post请求 3.1 发送post请求 注意scrapy.FormRequest()能够发送表单和ajax请求 3.1.1 思路分析 找到post的url地址点击登录按钮进行抓包然后定位url地址为找到请求体的规律分析post请求的请求体其中包含的参数均在前一次的响应中是否登录成功通过请求个人主页观察是否包含用户名 3.1.1 代码实现 import scrapyclass LoginSpider(scrapy.Spider):name loginallowed_domains [github.com]start_urls [https://github.com/login]def parse(self, response):# 从登录页面响应中解析出post数据token response.xpath(//input[nameauthenticity_token]/value).extract_first()post_data {commit: Sign in,authenticity_token: token,login: **************,password: **************,webauthn-conditional: undefined}print(post_data)# 针对登录url发送post请求yield scrapy.FormRequest(urlhttps://github.com/session,callbackself.after_login,formdatapost_data)def after_login(self, response):yield scrapy.Request(urlhttps://github.com/yixinchd,callbackself.check_login)def check_login(self, response):print(response.xpath(/html/head/title/text()).extract_first()) 注意 在settings.py中通过设置COOKIES_DEBUG True能够在终端看到cookie的传递过程 五、scrapy管道的使用 1、pipeline 中常用的方法 process_item(self, item, spider) 管道类中必须有的函数实现对item数据的处理必须return item open_spider(self, spider)在爬虫开启的时候仅执行一次close_spider(self, spider)在爬虫关闭的时候仅执行一次 2、管道文件的修改 3、开启管道 在settings.py设置开启pipeline 注意在settings中能够开启多个管道为什么需要开启多个 不同的pipeline可以处理不同爬虫的数据通过spider.name属性来区分不同的pipeline能够对一个或多个爬虫进行不同的数据处理的操作比如一个进行数据清洗一个进行数据的保存同一个管道类也可以处理不同爬虫的数据通过spider.name属性来区分 4、pipeline使用注意点 使用之前需要在settings中开启pipeline在settings中键表示位置即pipeline在项目中的位置可以自定义值表示距离引擎的远近越近数据会越先经过权重值小的优先执行有多个pipeline的时候process_item方法必须return item否则后一个pipeline取到的数据为None值pipeline中process_item的方法必须有否则item没有办法接收和处理process_item方法接收item和spider其中spider表示当前传递item过来的spideropen_spider(spider)能够在爬虫开启的时候执行一次close_spider(spider)能够在爬虫关闭的时候执行一次上述两个方法经常用于爬虫和数据库的交互在爬虫开启的时候建立数据库连接在爬虫关闭的时候断开数据库的连接 六、scrapy中间件的使用 1、scrapy中间件的分类和作用 1.1 scrapy中间件的分类 根据scrapy运行流程中所在位置不同分为 下载中间件爬虫中间件 1.2 scrapy中间件的作用 预处理request和response对象 对header以及cookie进行更换和处理使用代理ip等对请求进行定制化操作 在scrapy默认的情况下两种中间件都在middlewares.py文件中爬虫中间件使用方法和下载中间件相同且功能重复通常使用下载中间件 2、下载中间件的使用方法 Downloader Middlewares默认的方法 process_request(self, request, spider): 当每个request通过下载中间件时该方法被调用返回None值没有return也是返回None该request对象传递给下载器或通过引擎传递给其他权重低的process_request方法返回Response对象不再请求把response返回给引擎返回Request对象把request对象通过引擎交给调度器此时不通过其他权重低的process_request方法 process_response(self, request, response, spider): 当下载器完成http请求传递响应给引擎的时候调用返回Response对象通过引擎交给爬虫处理或交给权重更低的其他下载中间件的process_response方法返回Request对象通过引擎交给调度器继续请求此时将不通过其他权重低的process_request方法 在settings.py中配置开启中间件权重值越小越优先执行 3、定义实现随机User-Agent的下载中间件 3.1 在settings.py中添加UA列表 USER_AGENT_LIST [Mozilla/5.0 (Windows; U; Windows 98) AppleWebKit/532.16.1 (KHTML, like Gecko) Version/4.0.3 Safari/532.16.1,Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.0 (KHTML, like Gecko) Chrome/59.0.863.0 Safari/535.0,Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3 like Mac OS X; kl-GL) AppleWebKit/534.50.7 (KHTML, like Gecko) Version/4.0.5 Mobile/8B113 Safari/6534.50.7,Mozilla/5.0 (X11; Linux x86_64; rv:1.9.5.20) Gecko/7048-11-15 20:21:34 Firefox/11.0,Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_8_0) AppleWebKit/531.1 (KHTML, like Gecko) Chrome/54.0.878.0 Safari/531.1,Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_11_4; rv:1.9.6.20) Gecko/5511-07-04 09:40:02 Firefox/3.6.20,Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 6.1; Trident/3.1),Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.0; Trident/3.0),Mozilla/5.0 (Linux; Android 9) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/23.0.863.0 Safari/533.2,Mozilla/5.0 (Windows; U; Windows NT 10.0) AppleWebKit/531.7.2 (KHTML, like Gecko) Version/4.1 Safari/531.7.2,Mozilla/5.0 (compatible; MSIE 5.0; Windows 95; Trident/5.0),Mozilla/5.0 (iPad; CPU iPad OS 4_2_1 like Mac OS X) AppleWebKit/536.0 (KHTML, like Gecko) CriOS/36.0.810.0 Mobile/82Q614 Safari/536.0,Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/3.1),Mozilla/5.0 (iPad; CPU iPad OS 3_1_3 like Mac OS X) AppleWebKit/533.0 (KHTML, like Gecko) FxiOS/14.9o6822.0 Mobile/83W885 Safari/533.0,Mozilla/5.0 (Macintosh; PPC Mac OS X 10_10_0; rv:1.9.6.20) Gecko/5731-02-10 20:23:15 Firefox/6.0,Mozilla/5.0 (compatible; MSIE 8.0; Windows CE; Trident/3.0),Opera/8.62.(Windows NT 6.2; zh-HK) Presto/2.9.168 Version/12.00,Mozilla/5.0 (Windows 98) AppleWebKit/536.1 (KHTML, like Gecko) Chrome/13.0.827.0 Safari/536.1,Opera/9.98.(Windows NT 6.1; pa-PK) Presto/2.9.188 Version/12.00 ]3.2 在middleware.py中完善代码 import random from douban.settings import USER_AGENT_LIST# 定义一个中间件类 class RandomUserAgent(object):def process_request(self, request, spider):ua random.choice(USER_AGENT_LIST)request.headers[User-Agent] uaclass CheckUA:def process_response(self, request, response, spider):print(request.headers[User-Agent])return response3.3 在settings中设置开启自定义的下载中间件设置方法同管道 DOWNLOADER_MIDDLEWARES {douban.middlewares.RandomUserAgent: 543,douban.middlewares.CheckUA: 600, }4、代理IP的使用 4.1 思路分析 代理添加的位置request.meta中增加proxy字段获取一个代理IP赋值给request.meta[proxy] 代理池中随机选择代理IP代理IP的webapi发送请求获取一个代理IP 4.2 具体实现 class RandomProxy(object):def process_request(self, request, spider):proxy random.choice(PROXY_LIST)print(proxy)if user_passwd in proxy:# 对账号密码进行编码b64_up base64.b64encode(proxy[user_passwd].encode())# 设置认证request.headers[Proxy-Authorization] Basic b64_up.decode()# 设置代理request.meta[proxy] proxy[ip_port]else:# 设置代理request.meta[proxy] proxy[ip_port]4.3 检测代理IP是否可用 在使用了代理IP的情况下可以在下载中间件的process_response()方法中处理代理IP的使用情况如果该代理IP不能使用可以替换其他代理IP class ProxyMiddleware(object):......def process_response(self, request, response, spider):if response.status ! 200:request.dont_filter True # 重新发送的请求对象能够再次进入队列return request在settings.py中开启该中间件 5、在中间件中使用selenium 七、scrapy_redis的概念、作用及流程 1、分布式是什么 分布式就是不同的节点服务器IP不同共同完成一个任务 2、scrapy_redis的概念 scrapy_redis是scrapy框架的基于redis的分布式组件 3、scrapy_redis的作用 scrapy_redis在scrapy的基础上实现了更多更强大的功能具体体现在 通过持久化请求队列和请求的指纹集合来实现 断点续爬分布式快速抓取 4、scrapy_redis的工作流程 4.1 回顾scrapy流程 4.2 scrapy_redis的流程 在scrapy_redis中所有待抓取的request对象和去重的request对象指纹都存在所有的服务器共用的redis中所有服务器中scrapy进程共用同一个redis中的request对象的队列所有的request对象存入redis前都会通过该redis中的request指纹集合进行判断之前是否已经存入过在默认情况下所有的数据会保存在redis中 八、scrapy_redis原理分析并实现断点续爬以及分布式爬虫 未完待续
http://www.hkea.cn/news/14291716/

相关文章:

  • thinkphp做网站后台做彩票网站非法吗
  • 宁波企业自助建站系统网站开发都需要什么软件
  • 外贸数据分析网站网站色彩搭配
  • 心理学网站的建设百度上如何创建自己的网站
  • 购物商城网站开发实验报告wordpress禁用前台代码编辑器
  • dw个人网站制作模板北汽新能源汽车车型及价格
  • 大型网站建立动漫专业就业前景
  • 做水处理药剂的公司网站国外 wordpress 免费空间
  • 甘肃做网站哪个平台好电影网站建设步骤
  • 教学网站开发视频谷歌推广和seo
  • 好用的h5制作软件太原优化网站排名
  • 做网站用什么语言高效南京市高淳区城乡建设局网站
  • 嘉祥县网站建设常州辉煌网络网站建设
  • 电商网站的需求文档怎么免费做自己的网站
  • 网站原文件怎么上传空间网站建设的目标客户
  • 坑梓网站建设基本流程抖音代运营合作模式
  • 域名被墙检测网站建设阿华seo
  • 上海青浦房地产网站建设大连华南网站建设
  • 2016做砸了的小网站安装wordpress出错
  • 怎么看别人网站怎么做的网站该怎么找
  • html基础试题及答案seo网站推广的主要目的不包括
  • 做360网站优化快速商业模式包括哪些模式
  • 黄岩建设局网站网站内容管理系统
  • 长沙网站优化外包服务天津特定网站建设推广
  • 宁波模板建站定制网站垂直网站建设规模
  • 网站建设仟金手指专业12做poster的网站
  • 国内做的比较好的跨境电商网站平度网站建设公司电话
  • 唐山市建设网站wordpress修改 id
  • 建网站收费多少钱移动应用开发是什么意思
  • 网站与域名的关系有没有教做蛋糕的网站