scrapy框架,命令提示符,python爬虫


##请求传参,深度爬取。需求: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")这段代码请求出来的结果也是一个空列表,希望能得到解答
不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

根据你的描述和代码,有以下两个可能的问题:

  1. XPath路径错误。

在你的代码中,XPath路径 //*[@id='wrap']/div[2]/div[2]/div/div[1]/div[2]/ul/li 来选择职位列表。你需要确保该路径正确,否则爬虫将无法正确选择数据并返回一个空列表。

你可以在浏览器中打开相同的页面,然后使用浏览器的开发者工具来检查选定元素的XPath路径是否正确。这是一种快速解决XPath路径问题的方法。

  1. 回调函数名称错误。

在你的代码中,你传递了回调函数 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看下,如果还不行,可能不让爬取