scrapy爬虫案例-----赶集网

1.蜘蛛侠思路:

赶集网
爬取网站的url地址:点击超链接-----赶集网主页-------

步骤一:开始爬虫的第一步应该是要先明确需要爬取的目标网址,这就需要花一些时间了解网站的大致结构,以及明确自己想要获取的数据,并且需要知道这些数据是通过什么方式展现出来的,这就需要查看网站的源代码,如果网站源代码中没有这些数据,就需要考虑其是否是用ajax等方式发送的。

步骤二:观察切换页码时url地址的规律变化

步骤三:观察详情页url地址的规律变化,编写代码

-点击【切换城市】转到有所有城市的主页

点击切换城市

在这里插入图片描述

2.构造爬虫及代码解读

你可以通过cmd构建爬虫,也可以直接使用pycharm中自带的终端构建爬虫
在这里插入图片描述

#创建爬虫项目
scrapy startproject ganji_crawl

#创建爬虫
scrapy genspider ganji anshan.ganji.com

身为一个蜘蛛侠,首先就是需要猥琐,不能让网站知道你是蜘蛛侠,超人都需要隐藏身份,所以我们先写好settings.py文件,把自己伪装成浏览器,让网站不知道我们是蜘蛛侠,然后再写爬虫,以免暴露身份,我把每个文件都分成了单个函数来讲解,这样更方便理解一下,合在一起就是完整的了。

(1)settings.py

爬取一些简单的网站,不需要修改那么多,简单改一下就行了。

LOG_LEVEL='WARNING' #日志的输出等级,不想看那么多日志信息就可以写成WARNING

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'#把自己伪装成浏览器

ROBOTSTXT_OBEY = False #不遵从机器人协议

#把注释去掉就行
ITEM_PIPELINES = {
   
   'erShouFang.pipelines.ErshoufangPipeline': 300,
}

USER_AGENT随便打开一个网站按F12就能找到,不同浏览器的USER_AGENT是不一样的

在这里插入图片描述

(2)ganji.py

import scrapy
import re
from ..items import ErshoufangItem
class GanjiSpider(scrapy.Spider):
    name = 'ganji' #爬虫名,运行的关键参数
    start_urls = ['http://www.ganji.com/index.htm']

    def start_requests(self):
        for urls in self.start_urls:
            yield scrapy.Request(url=urls,callback=self.parse_province)

通过start_urls 对赶集网主页发起请求。重写 start_requests 方法,一般不直接用parse函数,构造一个新函数会更好;这里通过callback回调了一个新的函数parse_province

 def parse_province(self,response):
        all_city_href = response.xpath('.//div[@class="all-city"]/dl/dd/a/@href').extract()[:1]  #300个城市中选前1个
        for city_href in all_city_href:
            yield scrapy.Request(url=city_href+"zufang",callback=self.parse_detail_urls)

1.定义了一个解析主页所有城市超链接的函数,获取到所有城市的超链接,由于条件有限,这里就只获取第一个url,如果你想一口气干到底,你可以试着把[:1]这个限制去掉… 学到这个思路就好
/
2.extract() 返回的是一个列表extract_first()返回列表第一个元素,get()返回一个字符串
/
3.all_city_href获取到的url是不完整,所以还需要拼接一下才能请求到目标网址
/
4.callback回调函数,通过获取到的url发起新的请求
5.url = http://anshan.ganji.com/zufang/ , zufang=租房,二手房=ershoufang …

通过观察网站,我们发现详情页有我们需要的所有数据,所以这里我直接获取详情页的数据就行了。
我删

在这里插入图片描述在这里插入图片描述

    def parse_detail_urls(self,response):
        print("province_urls:" + response.url)
        all_detail_url = response.xpath('.//dd[@class="dd-item title"]/a/@href').extract()
        for detail_url in all_detail_url:
            if "http" in detail_url:
                yield scrapy.Request(url=detail_url,callback=self.parse_detail)
            if "http" not in detail_url:
                yield scrapy.Request(url="http:"+detail_url,callback=self.parse_detail)
        next_url = response.xpath('.//a[@class="next"]/@href').get()
        if next_url:
            yield scrapy.Request(url=next_url, callback=self.parse_detail_urls)

1.定义一个获取详情页url和实现自动翻页的函数,至于加这个 http 的判断是因为获取的详情页url中有一些是不完整的,所以需要加个判断
2.next_url获取下一页的url地址,通过callback回调自己,实现自动翻页,不需要再去看网站有多少一页,再写个循环了…

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值