讲解Scrapy框架之前,为了让读者更明白Scrapy,我会贴一些网站的图片和代码。 但是,【注意!!!】 【以下网站图片和代码仅供展示!!如果大家需要练习,请自己再找别的网站练习。】 【尤其是政府网站,千万不能碰哦!】
sudo pip3 install Scrapy
python -m pip install Scrapy
scrapy startproject 项目结构
scrapy genspider 爬虫文件名 允许爬取的域名
USER_AGENT = ' '
CONCURRENT_REQUESTS = 32
DOWNLOAD_DELAY = 0.1
DEFAULT_REQUEST_HEADERS = { }
LOG_LEVEL = ' '
LOG_FILE = 'xxx.log'
FEED_EXPORT_ENCODING = ' '
ITEM_PIPELINES = { '项目目录名.pipelines.类名': 优先级}
COOKIES_ENABLED = False
DOWNLOADER_MIDDLEWARES = { '项目目录名.middlewares.类名': 优先级}
# 17行,设置USER_AGENT
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
# 20行,是否遵循robots协议,一定要设置为False
ROBOTSTXT_OBEY = False
# 23行,最大并发量,默认为16
CONCURRENT_REQUESTS = 32
# 28行,下载延迟时间,每隔多长时间发一个请求(降低数据抓取频率)
DOWNLOAD_DELAY = 3
# 34行,是否启用Cookie,默认禁用,取消注释即为开启了Cookie
COOKIES_ENABLED = False
# 40行,请求头,类似于requests.get()方法中的 headers 参数
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
}
在终端项目文件夹中输入scrapy crawl 爬虫文件名
在pycharm中运行:
# 在run.py文件中
from scrapy import cmdline
cmdline.execute('scrapy crawl baidu'.split())
scrapy startproject Guazi
cd Guazi
scrapy genspider guazi www.gauzi.com
。:.゚ヽ(。◕‿◕。)ノ゚.:。+゚
scrapy crawl car -o car.csv
scrapy crawl car -o car.json
FEED_EXPORT_ENCODING = 'utf-8'
。:.゚ヽ(。◕‿◕。)ノ゚.:。+゚
提前建库建表
create database guazidb charset utf8;
use guazidb;
create table guazitab(
name varchar(200),
price varchar(100),
link varchar(300)
)charset=utf8;
。:.゚ヽ(。◕‿◕。)ノ゚.:。+゚
。:.゚ヽ(。◕‿◕。)ノ゚.:。+゚
item对象如何在两级解析函数中传递 – meta参数
yield scrapy.Request(
url=url,meta={
'item':item},callback=self.xxx
)
爬虫文件思路代码
案例操作:
# 上牌时间、行驶里程、排量、变速箱
time = scrapy.Field()
km = scrapy.Field()
displacement = scrapy.Field()
typ = scrapy.Field()
解析数据:guazi.py文件
import scrapy
from ..items import GuaziItem
class GuaziSpider(scrapy.Spider):
name = 'guazi'
allowed_domains = ['www.guazi.com']
# 1. 删掉start_urls变量
# 2. 重写start_requests()方法
def start_requests(self):
"""一次性生成所有要抓取的URL地址,一次性交给调度器入队列"""
for i in range(1, 6):
url = 'https://www.guazi.com/langfang/buy/o{}/#bread'.format(i)
# 交给调度器入队列,并指定解析函数
yield scrapy.Request(url=url, callback=self.detail_page)
def detail_page(self, response):
li_list = response.xpath('//div[@class="carlist-content clearfix"]/div')
for li in li_list:
# 给items.py中的GuaziItem类做实例化
item = GuaziItem()
item['name'] = li.xpath('./h5/text()').get()
item['price'] = li.xpath('./div[@class="card-price"]/p/text()').get()
item['link'] = 'https://www.guazi.com'+li.xpath('./img/@src').get()
# 把每辆汽车详情页的链接交给调度器入队列
# meta参数:在不同的解析函数之间传递数据
yield scrapy.Request(url=item['link'], meta={
'item':item}, callback=self.get_car_info)
def get_car_info(self,response):
'''提取每辆汽车二级页面的数据'''
# meta会随着response一起回来,作为response的一个属性
item = response.meta['item']
item['time'] = response.xpath(".//li[@class='one']/text()").get().strip()
item['km'] = response.xpath(".//li[@class='two']/span/text()").get().strip()
item['displacement'] = response.xpath(".//li[@class='three']/span/text()").get().strip()
item['typ'] = response.xpath(".//li[@class='one']/text()").get().strip()
# 至此,一辆汽车的完整数据提取完成!交给管道文件处理去吧!
yield item
管道文件存储数据:pipelines.py
之前写过了,这里再回忆一下
# 管道3 - 存入MongoDB数据库管道
import pymongo
class GuaziMongoPipeline(object):
def open_spider(self, spider):
"""连接mongodb"""
self.conn = pymongo.MongoClient(MONGO_HOST, MONGO_PORT)
self.db = self.conn[MONGO_DB]
self.myset = self.db[MONGO_SET]
def process_item(self, item, spider):
d = dict(item)
self.myset.insert_one(d)
return item
全局配置:settings.py
运行,查看mongo
> use guazidb;
> show collections
> db.guaziset.find().pretty()
此网站设置了反爬,所以有的字段爬取不到,不过没有关系,思路懂了就行。大多数小型网站是没有这种反爬的。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/179487.html原文链接:https://javaforall.cn