您的位置:首页 > 其它

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

2019-05-31 16:59 417 查看

今天遇到了一个百思不得其解的问题。我用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的使用方法,了解了列表调用

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: