700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > scrapy爬虫实践之抓取拉钩网招聘信息(2)

scrapy爬虫实践之抓取拉钩网招聘信息(2)

时间:2020-08-29 17:12:38

相关推荐

scrapy爬虫实践之抓取拉钩网招聘信息(2)

今天遇到了一个百思不得其解的问题。我用xpath获取目标网页的divs,理论上来说,应该是把这个div下的所有div存进了列表里,但是语句却是这样写的

divs = response.xpath('//*[@id="s_position_list"]/ul/li/div[1]')

实际上,在这个语句中,深入到了第一个div中。但这么写确实是对的。在其中查询单独的div确实还能查询的到。

之后,针对这个问题和Gao.c进行了讨论,大致得到了一个结论,上述代码中的li 字符并没有加【】去限制查询到的是第几个li,这种情况下,实际上会获取所有的li,并将之打包成一个list。同时,并不是将li下所有的内容都进行打包,而是将每一个li下的div[1]进行打包,最后形成一个divs。

那么之后就可以使用for循环进行遍历了。

那么在之后,我需要继续解决昨天遇到的问题,即302重定向的问题,我需要突破反爬机制进行数据的爬取。通过查询资料之后,逐渐有一些收获

如何应对ajax异步加载

scrapy突破反爬机制之应对javascript动态加载界面

上面这个链接里解决了有一些页面是动态加载的问题。其实这种问题也不难解决,我们只需要更深入的研究目标网页的源码,找到申请动态数据所发送的命令与对应的URL,就解决了这个问题。再然后,我们只需要模拟获取数据的URL,就可以爬取到动态加载的数据。

接下来我们看如何设置用户代理user-agent

我们可以使用fake-useragent这个开源库,所以我们首先

pip install fake-useragent

接下来我们在middlecare.py中加入一串代码,这是为了调用user-agent

from fake_useragent import UserAgentclass RandomUserAgentMiddlware(object):'''随机更换user-agent模仿并替换site-package/scrapy/downloadermiddlewares源代码中的useragent.py中的UserAgentMiddleware类'''def __init__(self, crawler):super(RandomUserAgentMiddlware, self).__init__()self.ua = UserAgent()#可读取在settings文件中的配置,来决定开源库ua执行的方法,默认是random,也可是ie、Firefox等等self.ua_type = crawler.settings.get("RANDOM_UA_TYPE", "random")@classmethoddef from_crawler(cls, crawler):return cls(crawler)#更换用户代理逻辑在此方法中def process_request(self, request, spider):def get_ua():return getattr(self.ua, self.ua_type)print get_ua()request.headers.setdefault('User-Agent', get_ua())

然后,我们还要再settings.py中设置开启此中间件,同时关闭默认的中间件

# Enable or disable downloader middlewares# See /en/latest/topics/downloader-middleware.htmlDOWNLOADER_MIDDLEWARES = {'JobSpider.middlewares.RandomUserAgentMiddlware': 543,'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,}

至此,每次请求的user-agent已随机更换

如何设置动态ip池

这个地方,作者还在焦头烂额的寻求解决方案。目前的思路是,首先通过西刺网拿到一系列免费的ip,然后写入本地资源池中,再利用scrapy_proxy进行调用。

但目前的使用效果还是很一般,同时作者也没有很好的理解它的具体原理和设置流程,今天就已经即将结束了。这个问题不如等到下次再来解决

如何爬取招聘会详情页的数据(重点在于爬取岗位描述)

虽说我们设置ip池失败了,还是不能规避302的问题,但是我们依旧可以以很慢的速度进行抓取。下面给出spider主程序。

# -*- coding: utf-8 -*-import scrapyfrom newlagou.items import xiangqingItemfrom scrapy import FormRequestimport timeimport randomimport jsonfrom scrapy.crawler import CrawlerProcessclass LagouSpider(scrapy.Spider):name = 'xiangqing'allowed_domains = ['']path = 'C:\\Users\Administrator\PycharmProjects\My_test\\newlagou\\newlagou\\web_list.json'file = open(path)data = json.load(file)list = []for i in data:list.append(i['job_web'])start_urls = list # 这里是我们开始爬取的网站def parse(self, response):item = xiangqingItem()job_title = response.xpath('/ html / body / div[4] / div / div[1] / div / span/text()').extract()job_money = response.xpath('/html/body/div[4]/div/div[1]/dd/p[1]/span[1]/text()').extract()job_location = response.xpath('/html/body/div[4]/div/div[1]/dd/p[1]/span[2]/text()').extract()job_experience = response.xpath('/html/body/div[4]/div/div[1]/dd/p[1]/span[3]/text()').extract()job_education = response.xpath('/html/body/div[4]/div/div[1]/dd/p[1]/span[4]/text()').extract()job_worktype = response.xpath('/html/body/div[4]/div/div[1]/dd/p[1]/span[5]/text()').extract()#获取JDdivs = response.xpath('//*[@id = "job_detail"]/dd[2]/div')job_descriptions = divs.xpath('./p/text()').extract()job_description = ''for i in job_descriptions:job_description += ijob_description += '\n'job_title = job_title[0] if len(job_title) > 0 else '无数据'job_money = job_money[0] if len(job_money) > 0 else '无数据'job_location = job_location[0] if len(job_location) > 0 else '无数据'job_experience = job_experience[0] if len(job_experience) > 0 else '无数据'job_education = job_education[0] if len(job_education) > 0 else '无数据'job_worktype = job_worktype[0] if len(job_worktype) > 0 else '无数据'job_description = job_description if len(job_description) > 0 else '无数据'item['job_title'] = job_title.strip()item['job_money'] = job_money.strip()item['job_location'] = job_location.strip()item['job_experience'] = job_experience.strip()item['job_education'] = job_education.strip()item['job_worktype'] = job_worktype.strip()item['job_description'] = job_description.strip()yield item

这个地方,我们关键的地方在于进一步学习了xpath的使用方法,了解了列表调用

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。