Scrapy 项目 Item 数据基础使用
1. 启用 item 管道
后面的数字是执行的级别, 数字越小越先执行.
2. 传值
Spider must return request, item, or None
传入值只支持这三种类型.
3. 保存数据
scrapy crawl csdn -o ./data/csdn/csdn.csv
4. 分组现象
scrapy.Request 方法
Request(url[, callback, method='GET', headers, body, cookies, meta, encoding='utf-8', priority=0, dont_filter=False, errback])
下面依次介绍这些参数。
url
: (必选)请求页面的url地址,bytes或str类型,如’http://www.python.org/doc’。callback
: 页面解析函数, Callable类型,Request对象请求的页面下载完成后,由该参数指定的页面解析函数被调用。如果未传28
递该参数,默认调用Spider的parse方法。method
: HTTP 请求的方法,默认为’GET’。- headers: HTTP 请求的头部字典,dict类型,例如{‘Accept’:‘text/html’, ‘User-Agent’:Mozilla/5.0’}。如果其中某项的值为None,就表示不发送该项HTTP头部,例如{‘Cookie’: None},禁止发送Cookie。
- body: HTTP请求的正文,bytes或str类型。
- cookies: Cookie信息字典,dict类型,例如{‘currency’: ‘USD’,‘country’: ‘UY’}。
meta
: Request的元数据字典,dict类型,用于给框架中其他组件传递信息,比如中间件Item Pipeline。其他组件可以使用Request对象的meta属性访问该元数据字典(request.meta),也用于给响应处理函数传递信息,详见Response的meta属性。- encoding: url和body参数的编码默认为’utf-8’。如果传入的url或body参数是str类型,就使用该参数进行编码。
- priority: 请求的优先级默认值为0,优先级高的请求优先下载。
dont_filter
: 默认情况下(dont_filter=False),对同一个url地址多次提交下载请求,后面的请求会被去重过滤器过滤(避免重复下载)。如果将该参数置为True,可以使请求避免被过滤,强制下载。例如,在多次爬取一个内容随时间而变化的页面时(每次使用相同的url),可以将该参数置为True。- errback: 请求出现异常或者出现HTTP错误时(如404页面不存在)的回调函数。
下面是爬取的列子
import scrapy
import re
class ShixianSpider(scrapy.Spider):
# 唯一标识符
name = 'shixian'
# 允许的域名
allowed_domains = ['shixian.com']
# 开始的 URL
start_urls = ['https://shixian.com/jobs']
def parse(self, response, **kwargs):
div_list = response.xpath("//div[@class='job-list']/div")
for div in div_list:
item = {
"title": div.xpath(".//h5/text()").extract_first().strip(),
"type_": div.xpath(".//h5/span/text()").extract_first().strip(),
"url": div.xpath("./div[1]/a/@href").extract_first().strip(),
"content": div.xpath("./div[1]//p/text()").extract_first().strip(),
"price": re.compile("\d+").findall(div.xpath(".//h4/text()").extract_first())[0],
"period": div.xpath(".//dl[1]/dd[2]/text()").extract_first().strip(),
"budget": div.xpath(".//dl[2]/dd[2]/text()").extract_first().strip(),
"start_time": div.xpath(".//dl[3]/dd[2]/text()").extract_first().strip()
}
# 进入细节页
yield scrapy.Request(
url="https://shixian.com/" + item["url"],
# self.parse_detail 调用 parse_detail 方法
callback=self.parse_detail,
# 向 self.parse_detail 传入参数
meta={
"item": item
}
)
# 下一页
next_url = response.xpath("//a[text()='›']/@href").extract_first()
# 循环
if next_url is not None:
yield scrapy.Request(
url="https://shixian.com/" + next_url,
callback=self.parse
)
def parse_detail(self, response):
item = response.meta["item"]
item["name"] = response.xpath("//section[@class='user']//span/text()").extract_first().strip()
item["address"] = response.xpath("//section[@class='company']/dl/dd[1]/span/text()").extract_first().strip()
item["number"] = response.xpath("//section[@class='company']/dl/dd[2]/span/text()").extract_first().strip()
item["financing"] = response.xpath("//section[@class='company']/dl/dd[3]/span/text()").extract_first().strip()
yield item