功能点:如何翻页爬取信息,如何发送请求,日志的简单实用
爬取网站:腾讯社会招聘网
完整代码:https://files.cnblogs.com/files/bookwed/tencent.zip
主要代码:
job.py
# -*- coding: utf-8 -*- import scrapy from tencent.items import TencentItem import logging # 日志模块 logger = logging.getLogger(__name__) class JobSpider(scrapy.Spider): """职位爬虫""" name = 'job' allowed_domains = ["tencent.com"] offset = 0 baseUrl = "https://hr.tencent.com/position.php?start={}" start_urls = [baseUrl.format(offset)] def parse(self, response): # //tr[@class="even" or @class="odd"] # xpath(),返回一个含有selector对象的列表 job_list = response.xpath("//tr[@class='even'] | //tr[@class='odd']") for job in job_list: item = TencentItem() # extract() 提取字符串,返回一个包含字符串数据的列表 # extract_first(),返回列表中的第一个字符串 # extract()[0] 可以替换成extract_first(),不用再进行判断是否为空了 item["name"] = job.xpath("./td[1]/a/text()").extract_first() item["url"] = job.xpath("./td[1]/a/@href").extract()[0] item["type"] = job.xpath("./td[2]/text()") item["type"] = item["type"].extract()[0] if len(item["type"]) > 0 else None item["people_number"] = job.xpath("./td[3]/text()").extract()[0] item["place"] = job.xpath("./td[4]/text()").extract()[0] item["publish_time"] = job.xpath("./td[5]/text()").extract()[0] # 打印方式1 # logging.warning(item) # 打印方式2,【推荐,可以看到是哪个文件打印的】 logger.warning(item) # 为什么使用yield?好处? # 让整个函数变成一个生成器。每次遍历的时候挨个读到内存中,不会导致内存的占用量瞬间变高 yield item # 第一种:拼接url # if self.offset < 3090: # self.offset += 10 # url = self.baseUrl.format(self.offset) # yield scrapy.Request(url, callback=self.parse) # yield response.follow(next_page, self.parse) # 第二种:从response获取要爬取的链接,并发送请求处理,知道链接全部提取完 if len(response.xpath("//a[@class='noactive' and @id='next']")) == 0: temp_url = response.xpath("//a[@id='next']/@href").extract()[0] # yield response.follow("https://hr.tencent.com/"+temp_url, callback=self.parse) yield scrapy.Request( "https://hr.tencent.com/"+temp_url, callback=self.parse, # meta={"item": item} # meta实现在不同的解析函数中传递数据 # dont_filter=True # 重复请求 ) # 此处的callback指返回的响应由谁进行解析,如果和第一页是相同的处理,则用parse,否则定义新方法,指定该新方法 def parse1(self, response): item = response.meta["item"] print(item) print("*"*30)
pipelines.py
import json class TencentPipeline(object): # 可选实现,参数初始化等 def __init__(self): self.f = open('tencent_job.json', 'w', encoding='utf-8') def process_item(self, item, spider): # item(Item对象) - 被爬取的item # spider(Spider对象)- 爬取item时的spider;通过spider.name可以获取爬虫名称 content = json.dumps(dict(item), ensure_ascii=False)+", " self.f.write(content) return item def open_spider(self, spider): # 可选,spider开启时,该方法被调用 pass def close_spider(self, spider): # 可选,spider关闭时,该方法被调用 self.f.close()