网络数据爬取(1)

scrapy爬虫框架创建网络爬取数据工程

注意: 一定要在你的创建的工程下打开这个工程 作为你的根目录 这样 你可以看到 你的根目录下 有个SCRAPY.cfg文件
如果你不在这个目录下打开 会报一个错误
Use “scrapy” to see available commands

最后一步的 运行命令 scrapy crawl ptcm01_test

当前环境
win7
python3.7
scrapy作为一个成熟的爬虫框架

如果没有安装SCRAPY 的 建议先安装SCRAPY
G

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
},
}

扫描二维码关注公众号,回复: 15503240 查看本文章
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)

猜你喜欢

转载自blog.csdn.net/m0_37317411/article/details/100512658