目标网站http://second.zz.fccs.com/,是一个郑州的二手房网站,采用scrapy框架来做做一个案列。这里使用pycharm来演示,那么现在pycharm的terminal终端创建一个项目scrapy startproject ershoufang,这里的名字就叫做ershoufang吧,然后我们生成一个爬虫scrapy genspider er_spider http://second.zz.fccs.com/,这里当然也可自己建一个,我们可以在spiders文件夹下新建一个er_spider文件,在这个里面编写自己的爬虫文件。

我们可以在pycharm的terminal终端输入命令scrapy shell http://second.zz.fccs.com/ ,进入scrapy shell ,response就是数据返回的对象,可以直接使用response.xpath('xpath语句')来提取我们想要的内容。

分析html结构发现我们需要的所有内容都在一个li标签下面,那么我们做一下测试,看看xpath语句对不对,如果xpath语句不会的话,可移至xpath语法学习。

#extract返回所有结果 extract_first返回一个结果 不加返回的是一个含有data的对象 
response.xpath('//div[@class="info0"]/div[@class="t"]/a/div[1]/text()').extract()  #提取标题
response.xpath('//div[@class="info1"]/div[@class="p1"]/div[1]/text()').extract()  #面积
response.xpath('//div[@class="info1"]/div[@class="p1"]/div[2]/span/text()').extract()  #价格
response.xpath('//div[@class="info0"]/div[@class="lp"]/label[2]/text()').extract()  #区

测试完成,就需要在items文件中把自己的数据对象定义一下,就是我们需要提取的内容,格式都是固定的,类必须继承spider.Item

items文件

class ErshoufangItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()   
    title = scrapy.Field()  #名字
    price = scrapy.Field()  #价格
    area = scrapy.Field()   #面积
    district = scrapy.Field()   #区

这里如果想手动建爬虫文件的话,可参考下面的代码:

er_spider文件

import scrapy
from from ershoufang.items import ErshoufangItem
#我们需要在爬虫文件中引入items中的类
#会显示红提示,但是不会出错

class ErshouFang(scrapy.Spider):
    name='ershou'  #爬虫的名字
    start_urls=['http://second.zz.fccs.com/']  #起始的url 固定的变量名

    def parse(self,response): #定义解析方法,名字固定为parse
        for ershoufang_item in response.xpath('//li[@class="item salelist"]'):  #先抓大,所有的内容都在li标签下
            yield{  创造一个生成器
                'title':ershoufang_item.xpath('./div[@class="info0"]/div[@class="t"]/a/div[1]/text()').extract(),
                'area':ershoufang_item.xpath('./div[3]/div/div[@class="p1"]/div[1]/text()').extract(),
                'price':ershoufang_item.xpath('./div[3]/div/div[@class="p1"]/div[2]/span/text()').extract(),
                'district':ershoufang_item.xpath('./div[@class="info0"]/div[@class="lp"]/label[2]/text()').extract()

            }
        #获取下一页的href a/[last()] 取出a的最后一个标签
        next_page=response.xpath('//div[@class="pages"]/div/div/div/a[last()]/@href').extract_first()
        if next_page is not None:  #如果存在下一页
            yield scrapy.Request(response.urljoin(next_page))
            #把下一页的链接交给scrapy.Request对象,使用urljoin拼接
settings文件


ROBOTSTXT_OBEY = False #默认为True,改为False不遵守爬虫协议


ITEM_PIPELINES = {
   'ershoufang.pipelines.ErshoufangPipeline': 300,
}  #settings文件本身就有,开启即可

MONGODB_HOST='127.0.0.1'  #本地
MONGODB_PORT=27017  #端口
MONGODB_DBNAME='ershoufang' #定义数据库名
MONGODB_DOCNAME='ershou'  #定义集合名

编写一个爬虫可以按照爬虫文件<------>items文件<------>settings文件<------->pipelines文件的顺序写。

常见报错

这个运行过程可能会出错,那么在这里提示一下,其实大部分还带你自己看明白。运行过程中,会一页一页的显示数据就像 DEBUG: Scraped from <200 http://xxxx.html>这样,有数据就是没有问题,那么也可能是这样DEBUG: Crawled (403) ,这是挂了,需要跟换ip,或者界面出现了验证码,一般都是请求太快,网页会显示验证码,我们只要跟换ip就可以了。

测试发现这个网页爬取到40到50页就会出现验证码,其实就是ip挂了,需要更换ip。我们也可以对数据保存为json或者csv格式到本地,使用scrapy crawl ersou -o ershou.json或者csv,自己可以练习一下。

scrapy官网查看详细内容

发表评论

后才能评论