关于爬取网站的信息遇到的有关问题
问题一:在scrapy框架中,使用的xpath去获取网站信息,没能拿到?
解决方法:xpath在scrapy框架中使用需要注意两件事:第一是使用的user-agent和你去获取的xpath,使用的浏览器需要相匹配;第二就是需要注意使用谷歌浏览器的时候一定要删去tbody标签,这样就基本可以成功爬取到东西了,(第一个事情是网上的其他人讲的,但是我不是很清楚,就当需要注意的事情吧;第二个是我自己曾经经历的过的,可以这样尝试,但是还是请大家详细情况具体分析;推荐本文的问题四,其中的方法应该可以说是比较好的=-=)以下就是我的一些配置:
1 2 3 4 | DEFAULT_REQUEST_HEADERS = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36' , 'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' , } |
使用的是谷歌浏览器去复制xpath。
问题二:在scrapy框架中如何使用for循环爬取的数据保存到item中?
解决方法:以下提供两种:
1 2 3 4 5 6 | items = response.xpath( "/html/body/div[2]/div" ) for i in items: m = item.xpath( './/div[1]/text()' ).extract_first() item = Item() item[ 'code' ] = m yield item |
1 2 3 4 5 6 7 8 9 10 | m = response.xpath( "/html/body/div[3]/div/div/div[4]/table/tbody/tr/td[6]/text()" ).extract() n = response.xpath( "/html/body/div[3]/div/div/div[4]/table/tbody/tr/td[6]/text()" ).extract() for i in range ( 0 , len (code)): #设置if语句去除不必要的标题类数据,如“申报要素”等 if i ! = 0 : item[ 'code' ] = m[i] item[ 'name' ] = n[i] yield item else : print ( "已经删除第一值" ) |
第二个方法是根据下标来操作数据的,所以下标的数据要保证准确无误,其中对于本来就是空值的数据,text()不能保存为None,默认跳过,需要小心注意。
问题三:当自己需要爬取的数据太过庞大的时候,并且其具有反爬虫机制的时候,我们如何最快速爬取出自己想要的数据。
1、使用scrapy-redis,采取windows+服务器的组合爬取数据
2、使用代理ip,代理ip建议购买豌豆的代理ip服务,价格比较便宜
3、使用crontab来增加定时任务,设置scrapy项目下载网页的速度为人为的速度,大致为5s到15s之间(请自己把握)
问题四:关于我们在使用xpath来获取相应元素的时候会出现一种情况,就是明明response.text可以返回出我们爬取网页的信息,但是在浏览器中copyXpath的路径却没有帮助我们获取到相应的信息,原因是那个xpath的路径跟我们response获取的页面信息路径不同。
解决方法:首先将response.text获取的页面保存在一个新建html文件中,再使用浏览器打开并使用copyXpath获取我们想要的元素的相应xpath,这个xpath才是不会出错的。(如果还是出错,那么请注意js出现的情况)
着重注意:爬取多级界面的时候一定要认清楚所有情况的url,最好是把所有种类情况的url都放在txt中对比,这样获取的url才不会出错或缺失。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步