##请求传参,深度爬取。需求:boss直聘岗位名称、岗位描述
import scrapy
#from bossPro.items import BossproItem
class BossSpider(scrapy.Spider):
name = "boss"
#allowed_domains = ["www.xxx.com"]
start_urls = ["https://www.zhipin.com/web/geek/job?query=Python&city=101010100"]
#定义解析详情页的函数
#回调函数接受item
def parse_detail(self,response):
item=response.meta["item"]#回调函数接受item
job_desc=response.xpath("//*[@id='main']/div[3]/div/div[2]/div[1]/div[2]//text()").extract()#返回的是一个包含字符串的列表
job_desc="".join(job_desc)#将列表中的字符串拼接
item["job_desc"]=job_desc
#print(job_desc)
yield item#将item提交给管道
def parse(self, response):
li_list=response.xpath("//*[@id='wrap']/div[2]/div[2]/div/div[1]/div[2]/ul/li")
for li in li_list:
job_name=li.xpath(".//div[1]/a/div[1]/span[1]/text()").extract_first()
#实例化一个item对象
item=BossproItem()
item["job_name"]=job_name
#print(job_name)
detail_url="https://www.zhipin.com"+li.xpath("./div[1]/a/@href").extract_first()
#对详情页发请求获取页面源码数据
#手动请求的发送
#请求传参:meta={},可以将meta字典传递给对应的回调函数即parse_detail
yield scrapy.Request(detail_url,callback=parse_detail,meta={"item":item})
通过cmd运行scrapy crawl boss没有出现报错,但是返回内容为空,仅仅显示项目所在的路径./bossPro/,网址代码和xpath路径没有错误,log_level=ERROR,DEBUG,INFO这三个值都试过没用,li_list=response.xpath("//*[@id='wrap']/div[2]/div[2]/div/div[1]/div[2]/ul/li")这段代码请求出来的结果也是一个空列表,希望能得到解答
不知道你这个问题是否已经解决, 如果还没有解决的话:根据你的描述和代码,有以下两个可能的问题:
在你的代码中,XPath路径 //*[@id='wrap']/div[2]/div[2]/div/div[1]/div[2]/ul/li
来选择职位列表。你需要确保该路径正确,否则爬虫将无法正确选择数据并返回一个空列表。
你可以在浏览器中打开相同的页面,然后使用浏览器的开发者工具来检查选定元素的XPath路径是否正确。这是一种快速解决XPath路径问题的方法。
在你的代码中,你传递了回调函数 parse_detail
作为 scrapy.Request()
的回调参数,但是你没有在代码的开头定义 parse_detail()
函数。
要解决这个问题,你需要在代码开头定义 parse_detail()
函数,例如:
class BossSpider(scrapy.Spider):
name = "boss"
start_urls = ["https://www.zhipin.com/web/geek/job?query=Python&city=101010100"]
def parse_detail(self,response):
item=response.meta["item"]
job_desc=response.xpath("//*[@id='main']/div[3]/div/div[2]/div[1]/div[2]//text()")
item["job_desc"]=job_desc.extract_first()
yield item
def parse(self, response):
li_list=response.xpath("//*[@id='wrap']/div[2]/div[2]/div/div[1]/div[2]/ul/li")
for li in li_list:
job_name=li.xpath(".//div[1]/a/div[1]/span[1]/text()").extract_first()
item = BossproItem()
item["job_name"]=job_name
detail_url="https://www.zhipin.com"+li.xpath("./div[1]/a/@href").extract_first()
# 回调函数名应为“self.parse_detail”,而不是“parse_detail”。
yield scrapy.Request(detail_url,callback=self.parse_detail,meta={"item":item})
通过这些步骤,你应该能够成功地爬取 boss 直聘的职位列表和职位描述信息。如果你仍然遇到问题,请查看你的日志输出,找出其他可能的问题并进行修正或联系技术支持人员。
把response获取到的网页源码打印输出下,可能是,没有正确获取到,可以在配置文件中设置下user-agent看下,如果还不行,可能不让爬取