针对“python中scrapy处理项目数据的实例分析”的完整攻略,我将分别从以下几个方面进行讲解:
- scrapy项目数据的处理流程
- scrapy数据抓取的实现方式
- scrapy数据处理的实例说明
1. scrapy项目数据的处理流程
scrapy的数据处理流程主要包括:数据抓取、数据解析、数据存储。下面分别对这三个步骤进行说明:
- 数据抓取:通过HTTP请求爬取目标网站上的数据。
- 数据解析:对抓取到的数据进行解析,将需要的信息抽取出来。
- 数据存储:将解析后的数据进行持久化存储。
2. scrapy数据抓取的实现方式
scrapy的数据抓取主要通过spiders实现。使用scrapy创建一个spider,需要继承scrapy.Spider类,并指定name、allowed_domains、start_urls这三个属性。其中,name为spider的唯一标识,allowed_domains为允许爬取的域名,start_urls为spider要抓取的起始页URL。
scrapy中常用的两种数据抓取方式为:
- 使用scrapy自带的response对象进行数据抓取。
- 使用第三方数据抓取库进行数据抓取,例如:requests、urllib等。
3. scrapy数据处理的实例说明
下面以抓取豆瓣电影Top250为例,对scrapy数据处理进行说明。其中,需要用到的库有:scrapy、requests、re。
具体步骤如下:
- 创建一个scrapy项目,使用命令
scrapy startproject douban_movie
即可创建一个名为douban_movie的scrapy项目。 - 创建一个名为douban_spider的spider,在douban_movie/spiders目录下创建douban_spider.py文件,并添加如下代码:
import scrapy
from douban_movie.items import DoubanMovieItem
class DoubanSpider(scrapy.Spider):
name = 'douban'
allowed_domains = ['movie.douban.com']
start_urls = ['https://movie.douban.com/top250']
def parse(self, response):
# 解析数据
item = DoubanMovieItem()
for info in response.xpath('//div[@class="info"]'):
title = info.xpath('div[@class="hd"]/a/span[1]/text()').extract_first().strip()
info_str = info.xpath('div[@class="bd"]/p[1]/text()').extract_first().strip().split('\n')
director = info_str[0].split(':')[-1].strip()
actors = info_str[1].strip()
year = info_str[2].split(':')[-1].strip()
country = info_str[3].split(':')[-1].strip()
category = info_str[4].split(':')[-1].strip()
score = info.xpath('div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract_first().strip()
comment_num = re.search('\d+', info.xpath('div[@class="bd"]/div[@class="star"]/span[last()]/text()').extract_first()).group()
quote = info.xpath('div[@class="bd"]/p[@class="quote"]/span/text()').extract_first()
item['title'] = title
item['director'] = director
item['actors'] = actors
item['year'] = year
item['country'] = country
item['category'] = category
item['score'] = score
item['comment_num'] = comment_num
item['quote'] = quote
yield item
# 翻页处理
next_page = response.xpath('//span[@class="next"]/a/@href')
if next_page:
next_url = response.urljoin(next_page[0].extract())
yield scrapy.Request(next_url, callback=self.parse)
在这个示例中,我们使用了response对象的xpath方法进行数据解析,获取到需要的数据,并使用item进行持久化存储。
- 创建一个DoubanMovieItem,用于存储豆瓣电影Top250的电影信息,在douban_movie/items.py文件中添加如下代码:
import scrapy
class DoubanMovieItem(scrapy.Item):
title = scrapy.Field()
director = scrapy.Field()
actors = scrapy.Field()
year = scrapy.Field()
country = scrapy.Field()
category = scrapy.Field()
score = scrapy.Field()
comment_num = scrapy.Field()
quote = scrapy.Field()
- 运行spider,使用
scrapy crawl douban -o movie.csv
命令即可将数据存储到名为movie.csv的文件中。
除了抓取豆瓣电影Top250之外,我们再来看一个抓取拉钩网招聘信息的实例:
- 创建一个名为lagou_spider的spider,在douban_movie/spiders目录下创建lagou_spider.py文件,并添加如下代码:
import scrapy
import json
from urllib.parse import urlencode
from douban_movie.items import LagouJobItem
class LagouSpider(scrapy.Spider):
name = 'lagou'
allowed_domains = ['www.lagou.com']
start_urls = ['https://www.lagou.com/']
def parse(self, response):
# 获取反爬取cookies
cookies_str = ''
for cookie in response.headers.getlist('Set-Cookie'):
cookies_str += str(cookie, encoding='utf-8')
anti_spider_cookies = {}
for cookie in cookies_str.split(';'):
values = cookie.split('=')
anti_spider_cookies[values[0]] = values[1]
# 发起招聘信息搜索请求
data = {
'first': True,
'pn': 1,
'kd': 'python'
}
search_url = 'https://www.lagou.com/jobs/positionAjax.json?' + urlencode(data)
headers = {
'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=',
'Cookie': cookies_str,
}
yield scrapy.Request(search_url, callback=self.parse_job_list, headers=headers, cookies=anti_spider_cookies)
def parse_job_list(self, response):
# 解析招聘信息列表
result = json.loads(response.text)
job_list = result['content']['positionResult']['result']
for job in job_list:
item = LagouJobItem()
item['company_name'] = job['companyFullName']
item['job_name'] = job['positionName']
item['salary'] = job['salary']
item['work_city'] = job['city']
item['work_years'] = job['workYear']
item['education'] = job['education']
item['job_description'] = job['positionAdvantage']
yield item
# 翻页处理
total_page_num = result['content']['positionResult']['totalCount'] // 15
for page in range(1, total_page_num + 1):
data = {
'first': False,
'pn': page,
'kd': 'python'
}
search_url = 'https://www.lagou.com/jobs/positionAjax.json?' + urlencode(data)
headers = {
'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=',
'Cookie': response.request.headers['Cookie'],
}
yield scrapy.Request(search_url, callback=self.parse_job_list, headers=headers, cookies=response.request.cookies)
在这个示例中,我们使用了反爬取Cookie进行反爬取处理,并使用json解析了拉钩网的招聘信息JSON格式数据。
- 创建一个LagouJobItem,用于存储拉钩网招聘信息,在douban_movie/items.py文件中添加如下代码:
import scrapy
class LagouJobItem(scrapy.Item):
company_name = scrapy.Field()
job_name = scrapy.Field()
salary = scrapy.Field()
work_city = scrapy.Field()
work_years = scrapy.Field()
education = scrapy.Field()
job_description = scrapy.Field()
- 运行spider,使用
scrapy crawl lagou -o lagou_job.csv
命令即可将数据存储到名为lagou_job.csv的文件中。
以上就是关于“python中scrapy处理项目数据的实例分析”的完整攻略,希望能对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python中scrapy处理项目数据的实例分析 - Python技术站