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 UserAgent class 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") @classmethod def 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 http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html DOWNLOADER_MIDDLEWARES = { 'JobSpider.middlewares.RandomUserAgentMiddlware': 543, 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, }
至此,每次请求的user-agent已随机更换
如何设置动态ip池
这个地方,作者还在焦头烂额的寻求解决方案。目前的思路是,首先通过西刺网拿到一系列免费的ip,然后写入本地资源池中,再利用scrapy_proxy进行调用。
但目前的使用效果还是很一般,同时作者也没有很好的理解它的具体原理和设置流程,今天就已经即将结束了。这个问题不如等到下次再来解决
如何爬取招聘会详情页的数据(重点在于爬取岗位描述)
虽说我们设置ip池失败了,还是不能规避302的问题,但是我们依旧可以以很慢的速度进行抓取。下面给出spider主程序。
# -*- coding: utf-8 -*- import scrapy from newlagou.items import xiangqingItem from scrapy import FormRequest import time import random import json from scrapy.crawler import CrawlerProcess class LagouSpider(scrapy.Spider): name = 'xiangqing' allowed_domains = ['lagou.com'] 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() #获取JD divs = response.xpath('//*[@id = "job_detail"]/dd[2]/div') job_descriptions = divs.xpath('./p/text()').extract() job_description = '' for i in job_descriptions: job_description += i job_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的使用方法,了解了列表调用
- scrapy爬虫实践之抓取拉钩网招聘信息(3)
- 爬虫框架Scrapy实战之批量抓取招聘信息--附源码
- Python爬虫框架Scrapy实战 - 抓取BOSS直聘招聘信息
- Python爬虫框架Scrapy实战之批量抓取招聘信息
- 爬虫框架Scrapy实战之批量抓取招聘信息
- Python爬虫框架Scrapy实战 - 抓取BOSS直聘招聘信息
- Python爬虫框架Scrapy实战 - 抓取BOSS直聘招聘信息
- Python爬虫框架Scrapy实战之批量抓取招聘信息
- python实践4——利用爬虫爬取“拉钩网——深圳——python岗位信息”
- 【python爬虫02】使用Scrapy框架爬取拉勾网招聘信息
- 实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
- Python爬虫框架Scrapy获得定向打击批量招聘信息
- 爬虫技术 -- 进阶学习(十)网易新闻页面信息抓取(htmlagilitypack搭配scrapysharp)
- 爬虫框架Scrapy实战之批量抓取招聘信息
- Python爬虫框架Scrapy实战之定向批量获取职位招聘信息
- Python中使用Scrapy爬虫抓取上海链家房价信息
- 基于scrapy的分布式爬虫抓取新浪微博个人信息和微博内容存入MySQL
- 网络爬虫之scrapy爬取某招聘网手机APP发布信息
- Scrapy爬虫实践之搜索并获取前程无忧职位信息(基础篇)
- Python爬虫框架Scrapy实战之定向批量获取职位招聘信息