scrapy爬虫框架创建网络爬取数据工程
注意: 一定要在你的创建的工程下打开这个工程 作为你的根目录 这样 你可以看到 你的根目录下 有个SCRAPY.cfg文件
如果你不在这个目录下打开 会报一个错误
Use “scrapy” to see available commands
最后一步的 运行命令 scrapy crawl ptcm01_test
当前环境
win7
python3.7
scrapy作为一个成熟的爬虫框架
如果没有安装SCRAPY 的 建议先安装SCRAPY
1、进入CMD模式
2、创建工程 格式:1.使用 “scrapy startproject 项目名称” 创建项目
scrapy startproject pctm
3、这个时候你就可以看到创建了一个PCTM的目录 和 SCRAPY.cfg的工程项目
4、进入pctm目录
有以下4个文件 和一个目录
items.py
middlewares.py
pipelines.py
settings.py
5.使用PyCharm打开项目编写程序。
6 在settings中添加如下代码 NEWSPIDER_MODULE =‘’ 后面 FEED_EXPORT_ENCODING = ‘UTF-8’
注意:这个参数 一个 是True 一个是Flase
ROBOTSTXT_OBEY = True
默认为True,就是要遵守robots.txt 的规则,而且在某些情况下我们想要获取的内容恰恰是被 robots.txt 所禁止访问的。所以,某些时候,我们就要将此配置项设置为 False ,拒绝遵守 Robot协议 !
7、下面我们就爬取数据进行准备工作
(考虑到网络上现在反爬的技术 因此我们需要模拟人工进行操作 这样 我们需要在middlewares.py中加入我们的网络延迟的代码
class RequestHeaderMiddleware(object):
cookie=“更改你需要访问网站的Cookie”
user_agent_list = [
‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36’,
‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:68.0) Gecko/20100101 Firefox/68.0’,
‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.1 Safari/605.1.15’
]
# 重写父类的process_request方法
def process_request(self, request, spider):
print(dir(request.headers))
ua = random.choice(self.user_agent_list)
request.headers.setdefault('User-Agent',ua)
request.headers['cookie'] = self.cookie
class RandomDelayMiddleware(object):
def init(self, delay):
self.delay = delay
@classmethod
def from_crawler(cls, crawler):
delay = crawler.spider.settings.get("RANDOM_DELAY", 10)
if not isinstance(delay, float):
raise ValueError("RANDOM_DELAY 必须是一个浮点数")
return cls(delay)
def process_request(self, request, spider):
print(request.headers)
delay = 0.5 + random.random() * self.delay
logging.debug("### 随机延迟: %s 秒 ###" % delay)
time.sleep(delay)
以上准备工作做好后
在spiders目录中 准备爬虫代码
建立一个新的test01.py文件
import scrapy
class Test01Spider(scrapy.Spider):
name = ‘cs58test’ # 注意: 这个地方据对不允许同名
allowed_domains = [‘58.com’]
start_urls = [‘https://bj.58.com/shangpucz/’]
custom_settings = {
“RANDOM_DELAY”: 2.0,
“DOWNLOADER_MIDDLEWARES”: {
‘scrapy.downloadermiddlewares.useragent.UserAgentMiddleware’: None,
“TC58.middlewares.RandomDelayMiddleware”: 999,
“TC58.middlewares.RequestHeaderMiddleware”: 543
#注意 这个TC58 这个地方指的是你当前目录下的 我现在的目录 是 Pctm 那么就要更改为PCTM
},
}
def parse(self, response):
for house in response.xpath('//ul[@class="house-list-wrap"]/li'):
print("-" * 32)
title = house.xpath('.//span[@class="title_des"]/text()').get();
base_info = house.xpath('.//p[@class="baseinfo"][1]/span/text()').getall()
bi = "^|^".join(base_info)
if len(base_info) == 2:
base_info.insert(0, "没有位置")
if len(base_info) == 3:
location = base_info[0]
type = base_info[1]
area = base_info[2]
else:
location=bi
nearby_loc = house.xpath('.//p[@class="baseinfo"][2]/span[1]/text()').get()
price_day = house.xpath('.//p[@class="sum"]/b/text()').get()
price_month = house.xpath('.//p[@class="unit"]/span/text()').get()
price_month_unit = "".join(house.xpath('.//p[@class="unit"]/text()').getall()).strip()
print(price_month)
yield {
"title": title,
"location": location,
"type": type,
"area": area,
"nearby_loc": nearby_loc,
"price_day": price_day,
"price_month": price_month,
"price_month_unit":price_month_unit,
"bi": bi
}
# # print(response.xpath('//ul[@class="house-list-wrap"]/li'))
for next_page in response.xpath('//div[@class="pager"]/a[@class="next"]'):
yield response.follow(next_page, self.parse)