Python爬虫项目--爬取链家热门城市新房

本次实战是利用爬虫爬取链家的新房(声明: 内容仅用于学习交流, 请勿用作商业用途)

环境

win8, python 3.7, pycharm

正文

1. 目标网站分析

通过分析, 找出相关url, 确定请求方式, 是否存在js加密等.

2. 新建scrapy项目

1. 在cmd命令行窗口中输入以下命令, 创建lianjia项目

scrapy startproject lianjia

2. 在cmd中进入lianjia文件中, 创建Spider文件

cd lianjia
scrapy genspider -t crawl xinfang lianjia.com

这次创建的是CrawlSpider类, 该类适用于批量爬取网页

3. 新建main.py文件, 用于执行scrapy项目文件

到现在, 项目就创建完成了, 下面开始编写项目

3 定义字段

在items.py文件中定义需要的爬取的字段信息

import scrapy
from scrapy.item import Item, Field

class LianjiaItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    city = Field()          #城市名
    name = Field()          #楼盘名
    type = Field()          #物业类型
    status = Field()        #状态
    region = Field()        #所属区域
    street = Field()        #街道
    address = Field()       #具体地址
    area = Field()          #面积
    average_price = Field() #平均价格
    total_price = Field()   #总价
    tags = Field()          #标签

4 爬虫主程序

在xinfang.py文件中编写我们的爬虫主程序

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from lianjia.items import LianjiaItem

class XinfangSpider(CrawlSpider):
    name = ‘xinfang‘
    allowed_domains = [‘lianjia.com‘]
    start_urls = [‘https://bj.fang.lianjia.com/‘]
    #定义爬取的规则, LinkExtractor是用来提取链接(其中,allow指允许的链接格式, restrict_xpaths指链接处于网页结构中的位置), follow为True表示跟进提取出的链接, callback则是调用函数
    rules = (
        Rule(LinkExtractor(allow=r‘\.fang.*com/$‘, restrict_xpaths=‘//div[@class="footer"]//div[@class="link-list"]/div[2]/dd‘), follow=True),
        Rule(LinkExtractor(allow=r‘.*loupan/$‘, restrict_xpaths=‘//div[@class="xinfang-all"]/div/a‘),callback= ‘parse_item‘, follow=True)
    )
    def parse_item(self, response):
        ‘‘‘请求每页的url‘‘‘‘
        counts = response.xpath(‘//div[@class="page-box"]/@data-total-count‘).extract_first()
        pages = int(counts) // 10 + 2
        #由于页数最多为100, 加条件判断
        if pages > 100:
            pages = 101
        for page in range(1, pages):
            url = response.url + "pg" + str(page)
            yield scrapy.Request(url, callback=self.parse_detail, dont_filter=False)

    def parse_detail(self, response):
        ‘‘‘解析网页内容‘‘‘
        item = LianjiaItem()
        item["title"] = response.xpath(‘//div[@class="resblock-have-find"]/span[3]/text()‘).extract_first()[1:]
        infos = response.xpath(‘//ul[@class="resblock-list-wrapper"]/li‘)
        for info in infos:
            item["city"] = info.xpath(‘div/div[1]/a/text()‘).extract_first()
            item["type"] = info.xpath(‘div/div[1]/span[1]/text()‘).extract_first()
            item["status"] = info.xpath(‘div/div[1]/span[2]/text()‘).extract_first()
            item["region"] = info.xpath(‘div/div[2]/span[1]/text()‘).extract_first()
            item["street"] = info.xpath(‘div/div[2]/span[2]/text()‘).extract_first()
            item["address"] = info.xpath(‘div/div[2]/a/text()‘).extract_first().replace(",", "")
            item["area"] = info.xpath(‘div/div[@class="resblock-area"]/span/text()‘).extract_first()
            item["average_price"] = "".join(info.xpath(‘div//div[@class="main-price"]//text()‘).extract()).replace(" ", "")
            item["total_price"] = info.xpath(‘div//div[@class="second"]/text()‘).extract_first()
            item["tags"] = ";".join(info.xpath(‘div//div[@class="resblock-tag"]//text()‘).extract()).replace(" ","").replace("\n", "")
            yield item

5 保存到Mysql数据库

在pipelines.py文件中编辑如下代码

import pymysql
class LianjiaPipeline(object):
    def __init__(self):
        #创建数据库连接对象
        self.db = pymysql.connect(
            host = "localhost",
            user = "root",
            password = "1234",
            port = 3306,
            db = "lianjia",
            charset = "utf8"
        )
        self.cursor = self.db.cursor()
    def process_item(self, item, spider):
        #存储到数据库中
        sql = "INSERT INTO xinfang(city, name, type, status, region, street, address, area, average_price, total_price, tags) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
        data = (item["city"], item["name"], item["type"], item["status"], item["region"], item["street"], item["address"], item["area"], item["average_price"], item["total_price"], item["tags"])
        try:
            self.cursor.execute(sql, data)
            self.db.commit()
        except:
            self.db.rollback()
        finally:
            return item

6 反反爬措施

由于是批量性爬取, 有必要采取些反反爬措施, 我这里采用的是免费的IP代理. 在middlewares.py中编辑如下代码:

from scrapy import signals
import logging
import requests
class ProxyMiddleware(object):
    def __init__(self, proxy):
        self.logger = logging.getLogger(__name__)
        self.proxy = proxy
    @classmethod
    def from_crawler(cls, crawler):
        ‘‘‘获取随机代理的api接口‘‘‘
        settings = crawler.settings
        return cls(
            proxy=settings.get(‘RANDOM_PROXY‘)
        )
    def get_random_proxy(self):
     ‘‘‘获取随机代理‘‘‘
        try:
            response = requests.get(self.proxy)
            if response.status_code == 200:
                proxy = response.text
                return proxy
        except:
            return False
    def process_request(self, request, spider):
     ‘‘‘使用随机生成的代理请求‘‘‘
        proxy = self.get_random_proxy()
        if proxy:
            url = ‘http://‘ + str(proxy)
            self.logger.debug(‘本次使用代理‘+ proxy)
            request.meta[‘proxy‘] = url

7  配置settings文件

import random
RANDOM_PROXY = "http://localhost:6686/random"
BOT_NAME = ‘lianjia‘
SPIDER_MODULES = [‘lianjia.spiders‘]
NEWSPIDER_MODULE = ‘lianjia.spiders‘
ROBOTSTXT_OBEY = False
DOWNLOAD_DELAY = random.random()*2
COOKIES_ENABLED = False
DEFAULT_REQUEST_HEADERS = {
  ‘Accept‘: ‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8‘,
  ‘Accept-Language‘: ‘en‘,
}
DOWNLOADER_MIDDLEWARES = {
   ‘lianjia.middlewares.ProxyMiddleware‘: 543
}
ITEM_PIPELINES = {
   ‘lianjia.pipelines.LianjiaPipeline‘: 300,
}

8 执行项目文件

在mian.py中执行如下命令

from scrapy import cmdline
cmdline.execute(‘scrapy crawl xinfang‘.split())

scrapy项目即可开始执行, 最后爬取到1万4千多条数据.

原文地址:https://www.cnblogs.com/star-zhao/p/9936468.html

时间: 2024-11-05 21:50:48

Python爬虫项目--爬取链家热门城市新房的相关文章

python爬虫:爬取链家深圳全部二手房的详细信息

1.问题描述: 爬取链家深圳全部二手房的详细信息,并将爬取的数据存储到CSV文件中 2.思路分析: (1)目标网址:https://sz.lianjia.com/ershoufang/ (2)代码结构: class LianjiaSpider(object): def __init__(self): def getMaxPage(self, url): # 获取maxPage def parsePage(self, url): # 解析每个page,获取每个huose的Link def pars

爬取链家任意城市租房数据(北京朝阳)

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2019-08-16 15:56 4 # @Author : Anthony 5 # @Email : [email protected] 6 # @File : 爬取链家任意城市租房数据.py 7 8 9 import requests 10 from lxml import etree 11 import time 12 import xlrd 13 import os

爬取链家任意城市二手房数据(天津)

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2019-08-16 12:40 4 # @Author : Anthony 5 # @Email : [email protected] 6 # @File : 爬取链家任意城市二手房数据.py 7 8 9 import requests 10 from lxml import etree 11 import time 12 import xlrd 13 import o

Python爬虫项目--爬取自如网房源信息

本次爬取自如网房源信息所用到的知识点: 1. requests get请求 2. lxml解析html 3. Xpath 4. MongoDB存储 正文 1.分析目标站点 1. url: http://hz.ziroom.com/z/nl/z3.html?p=2 的p参数控制分页 2. get请求 2.获取单页源码 1 # -*- coding: utf-8 -*- 2 import requests 3 import time 4 from requests.exceptions import

Python爬取链家二手房数据——重庆地区

最近在学习数据分析的相关知识,打算找一份数据做训练,于是就打算用Python爬取链家在重庆地区的二手房数据. 链家的页面如下: 爬取代码如下: import requests, json, time from bs4 import BeautifulSoup import re, csv def parse_one_page(url): headers={ 'user-agent':'Mozilla/5.0' } r = requests.get(url, headers=headers) so

Python的scrapy之爬取链家网房价信息并保存到本地

因为有在北京租房的打算,于是上网浏览了一下链家网站的房价,想将他们爬取下来,并保存到本地. 先看链家网的源码..房价信息 都保存在 ul 下的li 里面 ? 爬虫结构: ? 其中封装了一个数据库处理模块,还有一个user-agent池.. 先看mylianjia.py # -*- coding: utf-8 -*- import scrapy from ..items import LianjiaItem from scrapy.http import Request from parsel i

[Python爬虫] Selenium爬取新浪微博移动端热点话题及评论 (下)

这篇文章主要讲述了使用python+selenium爬取新浪微博的热点话题和评论信息.其中使用该爬虫的缺点是效率极低,傻瓜式的爬虫,不能并行执行等,但是它的优点是采用分析DOM树结构分析网页源码并进行信息爬取,同时它可以通过浏览器进行爬取中间过程的演示及验证码的输入.这篇文章对爬虫的详细过程就不再论述了,主要是提供可运行的代码和运行截图即可.希望文章对你有所帮助吧~ 参考文章 [python爬虫] Selenium爬取新浪微博内容及用户信息 [Python爬虫] Selenium爬取新浪微博客户

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

一. 文章介绍 前一篇文章"[python爬虫] Selenium爬取新浪微博内容及用户信息"简单讲述了如何爬取新浪微博手机端用户信息和微博信息. 用户信息:包括用户ID.用户名.微博数.粉丝数.关注数等. 微博信息:包括转发或原创.点赞数.转发数.评论数.发布时间.微博内容等. 它主要通过从文本txt中读取用户id,通过"URL+用户ID" 访问个人网站,如柳岩: http://weibo.cn/guangxianliuya 因为手机端数据相对精简简单,所以采用输

Python爬虫入门 | 爬取豆瓣电影信息

这是一个适用于小白的Python爬虫免费教学课程,只有7节,让零基础的你初步了解爬虫,跟着课程内容能自己爬取资源.看着文章,打开电脑动手实践,平均45分钟就能学完一节,如果你愿意,今天内你就可以迈入爬虫的大门啦~好啦,正式开始我们的第二节课<爬取豆瓣电影信息>吧!啦啦哩啦啦,都看黑板~1. 爬虫原理1.1 爬虫基本原理听了那么多的爬虫,到底什么是爬虫?爬虫又是如何工作的呢?我们先从"爬虫原理"说起.爬虫又称为网页蜘蛛,是一种程序或脚本.但重点在于:它能够按照一定的规则,自动