老铁们,大家好,相信还有很多朋友对于写真图片网站源码分享和写真照片设计的相关问题不太懂,没关系,今天就由我来为大家分享分享写真图片网站源码分享以及写真照片设计的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
3.模拟登录cookie操作
需求:爬取当前用户的相关用户信息(个人主页中显示的用户信息)http/https协议:无状态。没有请求到对应页面数据的原因:发起的第二次基于个人主页页面请求的时候,服务器并不知道该次请求是基于登录状态下的请求。cookie:用来让服务器端记录客户端的相关状态手动处理:抓包工具获取Cookie值,将值封装到headers中(不推荐)自动处理:Cookie值的来源是哪里?模拟登录post请求后,由服务器端创建的。
session会话对象:
私信小编01即可获取大量python学习资源
1.可以进行请求的发送;
2.如果请求过程中产生了Cookie,则该Cookie会被自动存储/携带在该session对象中。创建一个session对象:session=requests.Session()
使用session对象进行模拟登录post请求的发送(Cookie会被存储在session中)session对象对个人主页对应的get请求进行发送(携带了Cookie)
爬取当前用户的相关用户信息\n&39;&39;Cookie&39;xxxx&39;&39;\ndetail_url=&39;\ndetail_page_test=session.get(url=detail_url,headers=headers).text\nwithopen(&39;,&39;,encoding=&39;)asfp:\nfp.write(detail_page_test)
4.代{过}{滤}理理论讲解
代{过}{滤}理:破解封IP这种反爬机制。什么是代{过}{滤}理?代{过}{滤}理服务器。代{过}{滤}理的作用:突破自身IP被访问的限制可以隐藏自身真实的IP,免受攻击相关网站:快代{过}{滤}理西祠代{过}{滤}理代{过}{滤}理ip的类型:http:只能应用到http协议对应的url中https:只能应用到https协议对应的url中代{过}{滤}理ip的匿名度:透明:服务器知道该次请求使用了代{过}{滤}理,也知道请求对应的真实ip匿名:知道使用了代{过}{滤}理,不知道真实ip高匿:不知道使用了代{过}{滤}理,也不知道真实ip
5.代{过}{滤}理在爬虫中的应用
importrequests\n\nurl=&39;\nheaders={\n&39;:&39;\n}\npage_text=requests.get(url=url,headers=headers,proxies={&34;:&34;}).text\nwithopen(&39;,&39;,encoding=&39;)asfp:\nfp.write(page_text)
六、高性能异步爬虫
1.异步爬虫概述
同步:不同程序单元为了完成某个任务,在执行过程中需靠某种通信方式以协调一致,称这些程序单元是同步执行的。例如购物系统中更新商品库存,需要用“行锁”作为通信信号,让不同的更新请求强制排队顺序执行,那更新库存的操作是同步的。简言之,同步意味着有序。异步:为完成某个任务,不同程序单元之间过程中无需通信协调,也能完成任务的方式,不相关的程序单元之间可以是异步的。例如,爬虫下载网页。调度程序调用下载程序后,即可调度其他任务,而无需与该下载任务保持通信以协调行为。不同网页的下载、保存等操作都是无关的,也无需相互通知协调。这些异步操作的完成时刻并不确定。简言之,异步意味着无序。目的:在爬虫中使用异步实现高性能的数据爬取操作。
importrequests\n\nheaders={\n&39;:&39;\n}\nurls=[\n&39;,\n&39;,\n&39;\n]\n\ndefget_content(url):\nprint(&39;,url)\n39;响应数据的长度为:&使用单线程串行方式执行\ndefget_page(str):\nprint(&39;,str)\ntime.sleep(2)\nprint(&39;,str)\n\nname_list=[&39;,&39;,&39;,&39;]\nstart_time=time.time()\nforiinrange(len(name_list)):\nget_page(name_list[i])\nend_time=time.time()\nprint(&39;%(end_time-start_time))
使用线程池方式执行\nstart_time=time.time()\ndefget_page(str):\nprint(&39;,str)\ntime.sleep(2)\nprint(&39;,str)\n\nname_list=[&39;,&39;,&39;,&39;]\n\n线程池开辟4个线程\n需求:爬取梨视频视频数据\nimportrequests\nimportos\nfrommultiprocessing.dummyimportPool\nfromlxmlimportetree\nimportrandom\n\nheaders={\n&39;:&39;\n}\n39;__main__&生成一个存放视频的文件夹\nifnotos.path.exists(&39;):\nos.mkdir(&39;)\n39;https://www.pearvideo.com/category_5&39;//ul[@id=&34;]/li&存储所有视频的链接和文字\nforliinli_list:\ndetail_url=&39;+li.xpath(&39;)[0]\nname=li.xpath(&39;)[0]+&39;\n对详情页的url发起请求\ndetail_page_text=requests.get(url=detail_url,headers=headers).text\n39;//*[@id=&34;]/div[1]/div[2]/div/div[1]/h1/text()&39;./div/a/@href&39;_&39;https://www.pearvideo.com/videoStatus.jsp?&39;contId&39;mrd&39;User-Agent&39;Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/72.0.3626.121Safari/537.36&39;Referer&39;https://www.pearvideo.com/video_&34;videoInfo&39;videos&34;srcUrl&39;&39;/&39;/&39;-&39;cont-&39;-&39;-&39;name&39;url&39;url&39;./video/&39;name&39;.mp4&39;name&39;正在下载…….&持久化存储操作\nwithopen(path,&39;)asfp:\nfp.write(data)\nprint(dic[&39;]+&39;,&39;)\n\n39;正在请求的url是&39;请求成功,&asyncio修饰的函数,调用之后返回的一个协程对象\nc=request(&39;)\n\n创建一个事件循环对象\n\n将协程对象注册到loop中,然后启动loop\nloop=asyncio.get_event_loop()\n基于loop创建一个task任务对象\nprint(task)\nloop.run_until_complete(task)\nloop=asyncio.get_event_loop()\nloop.run_until_complete(task)\nresult返回的就是任务对象中封装的协程对象对应函数的返回值\nprint(task.result())\n将回调函数绑定到任务对象中\ntask.add_done_callback(callback_func)\nloop.run_until_complete(task)
8.多任务异步协程实现
importtime\nimportasyncio\n\nasyncdefrequest(url):\nprint(&39;,url)\ntime.sleep(2)\n39;下载完毕&39;www.baidu.com&39;www.sougou.com&39;www.goubanjia.com&任务列表:存放多个任务对象\nstasks=[]\nforurlinurls:\nc=request(url)\ntask=asyncio.ensure_future(c)\nstasks.append(task)\n\nloop=asyncio.get_event_loop()\n39;http://127.0.0.1:1080/bobo&39;http://127.0.0.1:1080/jay&39;http://127.0.0.1:1080/tom&39;正在下载&requests模块发起的请求是基于同步的,不能在异步模块中使用,否则会中断异步操作,必须使用基于异步的网络请求模块进行url的请求发送\n39;下载完毕&39;总耗时:&环境的安装pipinstallaiohttp\n39;http://www.baidu.com&39;http://www.sougou.com&39;http://www.taobao.com&get()、post():\n39;http://ip:port&text()返回的是字符串形式的响应数据\njson()返回的是json对象\nprint(page_text)\n\ntasks=[]\n\nforurlinurls:\nc=get_page(url)\ntask=asyncio.ensure_future(c)\ntasks.append(task)\n\nloop=asyncio.get_event_loop()\nloop.run_until_complete(asyncio.wait(tasks))\n\nend=time.time()\nprint(&39;,end-start)
七、动态加载数据处理
1.selenium简介
问题:selenium模块和爬虫之间具有怎样的关联?便捷地获取网站中动态加载的数据便捷实现模拟登录什么是selenium模块?基于浏览器自动化的一个模块。
2.selenium初试
selenium使用流程:
环境安装:pipinstallselenium下载一个对应浏览器的驱动程序(以谷歌浏览器为例)实例化一个浏览器对象编写基于浏览器自动化的操作代码发起请求:get(url)标签定位:find系列方法标签交互:send_keys(&39;)执行js程序:excute_script(&39;)前进、后退:forward()、back()关闭浏览器:quit()
实例化一个浏览器对象(传入浏览器的驱动程序)\nbro=webdriver.Chrome(executable_path=&39;)\n39;http://scxk.nmpa.gov.cn:81/xk/&获取浏览器当前页面的页面源码数据\npage_text=bro.page_source\n\n39;//ul[@id=&34;]/li&39;./dl/@title&39;./chromedriver.exe&39;https://www.taobao.com/&标签定位\nsearch_input=bro.find_element_by_id(&39;)\n39;iphone&执行一组js程序相当于F12–Console执行js代码\nbro.execute_script(&39;)\nsleep(2)\n39;.btn-search&39;https://baidu.com/&回退\nbro.back()\nsleep(2)\n导入动作链对应的类\nfromselenium.webdriverimportActionChains\n\nbro=webdriver.Chrome(executable_path=&39;)\n\nbro.get(&39;)\n\n39;iframeResult&切换浏览器标签定位的作用域\ndiv=bro.find_element_by_id(&39;)\n\n实例化动作链对象\nperform表示立即执行动作链操作\n释放动作链\naction.release()\n\nbro.quit()
5.selenium模拟登录空间
39;./chromedriver.exe&39;https://qzone.qq.com/&39;login_frame&39;switcher_plogin&39;u&39;p&39;QQ号码&39;QQ密码&39;login_button&实现无可视化界面\nfromselenium.webdriver.chrome.optionsimportOptions\n实现无可视化界面的操作\nchrome_options=Options()\nchrome_options.add_argument(&39;)\nchrome_options.add_argument(&39;)\n\n39;excludeSwitches&39;enable-automation&如何实现让selenium规避被检测到的风险\nbro=webdriver.Chrome(executable_path=&39;,chrome_options=chrome_options,options=option)\n\n39;https://www.baidu.com&!/usr/bin/envpython\n39;utf8&39;user&39;pass2&39;softid&39;Connection&39;Keep-Alive&39;User-Agent&39;Mozilla/4.0(compatible;MSIE8.0;WindowsNT5.1;Trident/4.0)&34;&34;\nim:图片字节\ncodetype:题目类型参考http://www.chaojiying.com/price.html\n&34;&39;codetype&39;userfile&39;ccc.jpg&39;http://upload.chaojiying.net/Upload/Processing.php&34;&34;\nim_id:报错题目的图片ID\n&34;&39;id&39;http://upload.chaojiying.net/Upload/ReportError.php&使用selenium打开登录页面\nfromseleniumimportwebdriver\nimporttime\nfromPILimportImage\nfromselenium.webdriverimportActionChains\n\nbro=webdriver.Chrome(executable_path=&39;)\nbro.execute_cdp_cmd(&34;,{\n&34;:&34;&39;webdriver&34;&34;\n})\n\n39;https://kyfw.12306.cn/otn/resources/login.html&最大化浏览器窗口\nbro.maximize_window()\ntime.sleep(1)\n\n39;login-hd-account&save_screenshot就是将当前页面进行截图且保存\nbro.save_screenshot(&39;)\n\n39;touclick-wrapper&验证码图片左上角的坐标x,y\nprint(&39;,location)\nsize=code_img_ele.size39;size:&左上角和右下角坐标39;x&39;y&39;x&39;width&39;y&39;height&至此验证码图片区域就确定下来了\n\ni=Image.open(&39;)\ncode_img_name=&39;\n\n将验证码图片提交给超级鹰进行识别\n\nchaojiying=Chaojiying_Client(&39;,&39;,&39;)\nim=open(&39;,&39;).read()\nprint(chaojiying.PostPic(im,9004)[&39;])\n\nresult=chaojiying.PostPic(im,9004)[&39;]\nall_list=[]39;|&39;|&39;,&39;,&39;,&39;,&遍历列表,使用动作链对每一个列表元素对应的x,y指定的位置进行点击操作\nforlinall_list:\nx=l[0]\ny=l[1]\n39;J-userName&39;12306账号&39;J-password&39;12306密码&39;J-login&action=ActionChains(bro)\nslider=bro.find_element_by_css_selector(&nc_1_n1z&action.click_and_hold(slider)\ntime.sleep(15)\nexceptExceptionase:\nfirstBlood__first\nimportscrapy\n\nclassFirstSpider(scrapy.Spider):\n39;first&允许的域名:用来限定start_urls列表中哪些url可以进行请求发送\n39;www.baidu.com&起始的url列表:该列表中存放的url会被scrapy自动进行请求的发送\nstart_urls=[&39;,&39;]\n\n39;qiubai&allowed_domains=[&39;]\nstart_urls=[&39;]\n\ndefparse(self,response):\n39;//div[@id=&34;]/div&xpath返回的是列表,当时列表元素一定是Selector类型的对象\n39;./div[1]/a[2]/h2/text()&列表调用了extract之后。则表示将列表中每一个Selector对象中data对应的字符串提取了出来\ncontent=div.xpath(&39;).extract()\ncontent=&39;.join(content)\n\nprint(author,content)\nbreak
4.基于终端指令的持久化存储
scrapy持久化存储:
基于终端指令:要求:只可以将parse方法的返回值存储到本地的文本文件中注意:持久化存储对应的文本文件类型只可以为:json、jsonlines、jl、csv、xml、marshal、pickle指令:scrapycrawlxxx-ofilePath好处:简洁高效便捷缺点:局限性比较强(数据只可以存储到指定后缀的文本文件中)
5.基于管道持久化存储操作
基于管道:
编码流程:数据解析在item类中定义相关的属性将解析的数据封装到item类型的对象将item类型的对象提交给管道进行持久化存储的操作在管道类的process_item中要将其接收到的item对象中存储的数据进行持久化存储操作在配置文件中开启管道好处:通用性强。
面试题:将爬取到的数据一份存储到本地,一份存储到数据库,如何实现?
管道文件中一个管道类对应的是将数据存储到一种平台爬虫文件提交的item只会给管道文件中第一个被执行的管道类接收process_item中的returnitem表示将item传递给下一个即将被执行的管道类
6.全站数据爬取
基于spider的全站数据爬取:就是将网站中某板块下的全部页码对应的页面数据进行爬取。
爬取:校花网明星写真的名称实现方式:将所有页面的url添加到start_urls列表(不推荐)自行手动进行请求发送(推荐)
&39;&39;&39;\n39;xiaohua&allowed_domains=[&39;]\nstart_urls=[&39;]\n\n39;http://www.521609.com/tuku/mxxz/index_%d.html&39;/html/body/div[4]/div[3]/ul/li&39;./a/p/text()&手动请求发送:callback回调函数是专门用作于数据解析\nyieldscrapy.Request(url=new_url,callback=self.parse)\n\n&39;&39;&39;\nDefineyouritempipelineshere\nDon&See:https://doc.scrapy.org/en/latest/topics/item-pipeline.html\n\nclassXiaohuaproPipeline(object):\ndefprocess_item(self,item,spider):\nreturnitem\n\n&39;&39;&39;\nROBOTSTXT_OBEY=False\nLOG_LEVEL=&39;\nUSER_AGENT=&39;
7.五大核心组件
五大核心组件:
Spiders:产生URL,对URL进行手动发送进行数据解析引擎(ScrapyEngine):数据流处理触发事务调度器(Scheduler):过滤器去重去重后的请求对象压到队列中下载器(Downloader):负责获取页面数据并提供给引擎,而后提供给Spider项目管道(ItemPipeline):负责处理爬虫从网页中抽取的实体,页面被爬虫解析所需的数据存入item后,将被发送到管道,经过特定的次序处理数据,最后存入本地文件或者数据库。
8.请求传参
使用场景:如果爬取解析的数据不在同一张页面中。(深度爬取)需求:爬取boss的岗位名称和岗位描述
我尝试着并未有啥结果…….等大佬\nimportscrapy\nfrombossPro.itemsimportBossproItem\n\nclassBossSpider(scrapy.Spider):\nname=&39;\n39;www.xxx.com&39;https://www.zhipin.com/c100010000/?page=1&ka=page-1&39;https://www.zhipin.com/c100010000/?page=%d&回调函数接收item\ndefparse_detail(self,response):\nitem=response.meta[&39;]\n\njob_desc=response.xpath(&34;main&39;).extract()\njob_desc=&39;.join(job_desc)\nprint(job_desc)\nitem[&39;]=job_desc\n\nyielditem\n\n39;//*[@id=&34;]/div/div[2]/ul/li&39;.//div/div[1]/div[1]/div/div[1]/span[1]/a/text()&39;job_name&39;https://www.zhipin.com&39;.//div/div[1]/div[1]/div/div[1]/span[1]/a/@href&对详情页发请求获取详情页的页面源码数据\n请求传参:meta={},可以将meta字典传递给请求对应的回调函数\nyieldscrapy.Request(detail_url,callback=self.parse_detail,meta={&39;:item})\n\n39;./imgs_ZYZhang&39;&39;—————-爬取站长素材高清图片img.py———————–&39;&-*-coding:utf-8-*-\nimportscrapy\nfromimgsPro.itemsimportImgsproItem\n\nclassImgSpider(scrapy.Spider):\nname=&39;\n39;www.xxx.com&39;http://sc.chinaz.com/tupian/&39;//div[@id=&34;]/div&注意:使用伪属性src2\nsrc=&39;+div.xpath(&39;).extract_first()\n\nitem=ImgsproItem()\nitem[&39;]=src\n\nyielditem\n&39;&39;&39;\nDefineyouritempipelineshere\nDon&See:https://doc.scrapy.org/en/latest/topics/item-pipeline.html\n\ndefprocess_item(self,item,spider):\n可以根据图片地址进行图片数据的请求\ndefget_media_requests(self,item,info):\n\nyieldscrapy.Request(item[&39;])\n\n39;/&返回给下一个即将被执行的管道类\n&39;&39;&39;\nDefineherethemodelsforyourscrapeditems\nSeedocumentationin:\ndefinethefieldsforyouritemherelike:\nsrc=scrapy.Field()\n39;&39;——————————爬取站长素材高清图片setting.py部分代码——————-&39;&指定图片存储的目录\nIMAGES_STORE=&39;\nITEM_PIPELINES={\n&39;:300,\n}\nLOG_LEVEL=&39;\n39;Mozilla/5.0(Macintosh;IntelMacOSX10_12_0)AppleWebKit/537.36(KHTML,likeGecko)Chrome/75.0.3770.100Safari/537.36&Obeyrobots.txtrules\nROBOTSTXT_OBEY=False
10.中间件
下载中间件:位置:引擎和下载器之间作用:批量拦截到整个工程中所有的请求和响应拦截请求:UA伪装:process_request代{过}{滤}理IP:process_exception:returnrequest拦截响应:篡改响应数据,响应对象网易新闻爬取
11.网易新闻
需求:爬取网易新闻的新闻数据(标题和内容)
通过网易新闻的首页解析出几大板块对应的详情页的url(经验证,无动态加载)每个板块点击后,其中的新闻标题都是动态加载出来的(动态加载)通过解析出每一条新闻详情页的url,获取详情页的页面源码,解析出新闻内容
&39;&39;&39;\n39;wangyi&allowed_domains=[&39;]\nstart_urls=[&39;]\nmodels_urls=[]解析五大板块对应详情页的url\n\n39;F:\\PythonProjects\\爬虫\\动态加载数据处理\\chromedriver.exe&39;//*[@id=&34;]/div[1]/div[2]/div[2]/div[2]/div[2]/div/ul/li&39;./a/@href&依次对每一个板块对应的页面进行请求\nforurlinself.models_urls:每一个板块对应的新闻标题相关的内容都是动态加载\ndefparse_model(self,response):response.xpath()\ndiv_list=response.xpath(&39;)\nfordivindiv_list:\ntitle=div.xpath(&39;).extract_first()\nnew_detail_url=div.xpath(&39;).extract_first()\n\nitem=WangyiproItem()\nitem[&39;]=title\n\n39;item&解析新闻内容\ncontent=response.xpath(&34;content&39;).extract()\ncontent=&39;.join(content)\nitem=response.meta[&39;]\nitem[&39;]=content\n\nyielditem\n\ndefclosed(self,spider):\nself.bro.quit()\n\n&39;&39;&39;\nDefineyouritempipelineshere\nDon&See:https://doc.scrapy.org/en/latest/topics/item-pipeline.html\n\nclassWangyiproPipeline(object):\ndefprocess_item(self,item,spider):\nprint(item)\nreturnitem\n&39;&39;&39;\nDefineherethemodelsforyourspidermiddleware\nSeedocumentationin:\nNotallmethodsneedtobedefined.Ifamethodisnotdefined,\npassedobjects.\n\ndefprocess_request(self,request,spider):\nmiddleware.\n\n-returnNone:continueprocessingthisrequest\n-orreturnaRequestobject\ninstalleddownloadermiddlewarewillbecalled\nreturnNone\n\nspider爬虫对象\nbro=spider.bro挑选出指定的响应对象进行篡改\n通过request指定response\nifrequest.urlinspider.models_urls:\nbro.get(request.url)包含了动态加载的新闻数据\n\n五大板块对应的响应对象\n实例化一个新的响应对象(符合需求:包含动态加载出的新闻数据),替代原来旧的响应对象\n基于selenium便捷的获取动态加载数据\nnew_response=HtmlResponse(url=request.url,body=page_text,encoding=&39;,request=request)\n\nreturnnew_response\nelse:\n其他请求对应的响应对象\nreturnresponse\n\ndefprocess_exception(self,request,exception,spider):\n(fromotherdownloadermiddleware)raisesanexception.\n\n-returnNone:continueprocessingthisexception\n-returnaRequestobject:stopsprocess_exception()chain\npass\n&39;&39;&39;\n39;wangyiPro(+http://www.yourdomain.com)&39;Mozilla/5.0(Macintosh;IntelMacOSX10_12_0)AppleWebKit/537.36(KHTML,likeGecko)Chrome/74.0.3729.169Safari/537.36&Obeyrobots.txtrules\nROBOTSTXT_OBEY=False\nSeehttps://doc.scrapy.org/en/latest/topics/downloader-middleware.html\nDOWNLOADER_MIDDLEWARES={\n&39;:543,\n}\nITEM_PIPELINES={\n&39;:300,\n}\nLOG_LEVEL=&39;
12.CrawlSpider的全站数据爬取
CrawlSpider:基于Spider的一个子类
全站数据爬取的方式基于Spider:手动请求发送基于CrawlSpiderCrawlSpider的使用:创建一个工程cdXXX创建爬虫文件(CrawlSpider)scrapygenspider-tcrawlxxxwww.xxxx.com链接提取器(LinkExtractor):根据指定规则(allow=&34;)进行指定链接的提取规则解析器(Rule):将链接提取器提取到的链接进行指定规则(callback)的解析操作需求:爬取阳光热线网站中的编号,新闻标题,新闻内容,标号分析:爬取的数据没有在同一张页面中可以使用链接提取器提取所有的页码链接让链接提取器提取所有的问政详情页链接
&39;&39;&39;\n&39;&39;&39;\n需求:爬取阳光热线网站中的编号,新闻标题,新闻内容,标号\nclassSunSpider(CrawlSpider):\nname=&39;\n39;www.xxx.com&39;http://wz.sun0769.com/political/index/politicsNewest?id=1&page=&链接提取器:根据指定规则(allow=&34;)进行指定链接的提取\nlink=LinkExtractor(allow=r&39;)\nlink_detail=LinkExtractor(allow=r&39;)\nrules=(\n39;parse_item&follow=True:可以将链接提取器继续作用到链接提取器提取到的链接所对应的页面中\nRule(link_detail,callback=&39;)\n)\nhttp://wz.sun0769.com/political/politics/index?id=490504\n\n如下两个解析方法中是不可以实现请求传参!\n注意:xpath表达式中不可以出现tbody标签\nli_list=response.xpath(&39;)\nforliinli_list:\nnew_num=li.xpath(&39;).extract_first()\nnew_title=li.xpath(&39;).extract_first()\n\nitem=SunproItem()\nitem[&39;]=new_title\nitem[&39;]=new_num\n\nyielditem\n\n39;/html//div[3]/div[2]/div[2]/div[1]/span[4]/text()&34;\\r\\n&34;&34;&34;&39;/html//div[3]/div[2]/div[2]/div[2]/pre/text()&39;&print(new_id,new_content)\nitem=DetailItem()\nitem[&39;]=new_content\nitem[&39;]=new_id\n\nyielditem\n\n&39;&39;&39;\nDefineyouritempipelineshere\nDon&See:https://doc.scrapy.org/en/latest/topics/item-pipeline.html\n\nclassSunproPipeline(object):\ndefprocess_item(self,item,spider):\n将数据写入数据库时,如何保证数据的一致性\nifitem.__class__.__name__==&39;:\nprint(item[&39;],item[&39;])\nelse:\nprint(item[&39;],item[&39;])\nreturnitem\n\n&39;&39;&39;\nDefineherethemodelsforyourscrapeditems\nSeedocumentationin:\ndefinethefieldsforyouritemherelike:\ntitle=scrapy.Field()\nnew_num=scrapy.Field()\n\nclassDetailItem(scrapy.Item):\nnew_id=scrapy.Field()\ncontent=scrapy.Field()
13.分布式概述及搭建
分布式爬虫:
概念:我们需要搭建一个分布式的机群,让其对一组资源进行分布联合爬取。作用:提升爬取数据的效率
如何实现分布式?
安装一个scrapy-redis的组件原生的scrapy是不可以实现分布式爬虫的,必须要让scrapy-redis组件一起实现分布式爬虫。
为什么原生的scrapy不可以实现分布式?
调度器不可以被分布式机群共享管道不可以被分布式机群共享
scrapy-redis组件作用:
可以给原生的scrapy框架提供可以被共享的管道和调度器。
scrapy-redis实现流程:
创建一个工程创建一个基于CrawlSpider的爬虫文件修改当前的爬虫文件:导包:fromscrapy_redis.spidersimportRedisCrawlSpider将start_urls和allowed_domains进行注释添加一个新属性:redis_key=&39;可以被共享的调度器队列的名称编写数据解析相关的操作将当前爬虫类的父类修改成RedisCrawlSpider修改配置文件settings指定使用可以被共享的管道:ITEM_PIPELINES={&39;:400}指定调度器:增加了一个去重容器类的配置,作用是用Redis的set集合来存储请求的指纹数据,从而实现请求去重的持久化DUPEFILTER_CLASS=&34;使用scrapy-redis组件自己的调度器SCHEDULER=&34;配置调度器是否要持久化,也就是当爬虫结束了,要不要清空Redis中请求队列和去重指纹的set。如果是True,就表示要持久化存储,就不清数据,否则清空数据SCHEDULER_PERSIST=True指定redis服务器redis相关操作配置:配置redis的配置文件:linux或者mac:redis.confwindows:redis.windows.conf打开配置文件修改:将bind127.0.0.1进行注释或删除关闭保护模式:protected-modeyes改为no结合着配置文件开启redis服务redis-server配置文件启动客户端:redis-cli执行工程:scrapyrunspiderxxx.py向调度器的队列中放入一个起始的url:调度器的队列在redis的客户端中lpushxxxwww.xxx.com爬取到的数据存储在了redis的proName:items这个数据结构中
14.增量式爬虫
概念:监测网站数据更新的情况,只会爬取网站最新更新出来的数据。分析:指定一个起始url基于CrawlSpider获取其他页码链接基于Rule将其他页码链接进行请求从每一个页码对应的页面源码中解析出每一个电影详情页的URL核心:检测电影详情页的url之前有没有请求过将爬取过的电影详情页的url存储存储到redis的set数据结构对详情页的url发起请求,然后解析出电影的名称和简介进行持久化存储
九、补充——异步编程
为什么要讲?
这一部分的知识点不太容易学习(异步非阳塞、asyncio)异步相关话题和框架越来越多,例如:tornado、fastapi、django3.xasgi、aiohttp都在异步→提升性能
如何讲解?
第一部分:协程第二部分:asyncio模块进行异步编程第三部分:实战案例
1.协程
协程不是计算机提供,程序员人为创造。
协程(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术。简而言之,其实就是通过一个线程实现代码块相互切换执行。
deffunc1():\nprint(1)\n…\nprint(2)\ndeffunc2():\nprint(3)\n…\nprint(4)\nfunc1()\nfunc2()
实现协程的集中方法:
greelet,早期模块yield关键字asyncio装饰器(py3.4及以后版本)async、await关键字(py3.5及以后版本)
(1)greenlet实现协程
pipinstallgreenlet
fromgreenletimportgreenlet\ndeffunc1():\nprint(1)\ngr2.switch()切换到func2函数,从上一次执行的位置继续向后执行\ndeffunc2():\nprint(3)\ngr1.switch()去执行func1函数
写真图片网站源码分享的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于写真照片设计、写真图片网站源码分享的信息别忘了在本站进行查找哦。
