爬虫实战-爬取房天下网站全国所有城市的新房和二手房信息(最新)

2023-05-16

看到https://www.cnblogs.com/derek1184405959/p/9446544.html项目:爬取房天下网站全国所有城市的新房和二手房信息和其他博客的代码,因为网站的更新或者其他原因都不能正确爬取数据并存储

https://blog.csdn.net/qq_35649945/article/details/92729815 若将数据进行多种方式存储参考此博客

对爬取数据进行分析https://blog.csdn.net/qq_43609802/article/details/106355722

爬取结果

 

 

网站url分析

1.获取所有城市url

   https://www.fang.com/SoufunFamily.htm

    例如:https://cq.fang.com/

2.新房url

  
https://sz.newhouse.fang.com/house/s/

3.二手房url

 之前 https://esf.sh.fang.com/

 现在https://sh.esf.fang.com/
4.北京新房和二手房url规则不同

   https://newhouse.fang.com/house/s/
   https://esf.fang.com/

注意和之前的URL的不同,

不改变的话会在爬虫过程一直发生重定向

https://blog.csdn.net/qq_43609802/article/details/106353479已经注意到这个问题并解决了

创建项目

cd 目标目录
scrapy startproject fang
cd fang
scrapy genspider sfw fang.com

在项目中新建 start.py文件

from scrapy import cmdline

cmdline.execute("scrapy crawl sfw_spider".split())

分析网页

获取省和市

注意:当市有多行时,第二行开始就没有了省份,需要作出判断,为市添加对应的省份

    def parse(self, response):
        trs=response.xpath('.//div[@class="outCont"]//tr')
        provice = None
        for tr in trs:
            # 排除掉第一个td,两个第二个和第三个td标签
            tds = tr.xpath(".//td[not(@class)]")
            provice_td = tds[0]
            provice_text = provice_td.xpath(".//text()").get()
            # 如果第二个td里面是空值,则使用上个td的省份的值
            provice_text = re.sub(r"\s", "", provice_text)
            if provice_text:
                provice = provice_text
            # 排除海外城市
            if provice == '其它':
                continue
           

获取城市URL进行新房和二手房URL拼接

            city_td=tds[1]
            city_links = city_td.xpath(".//a")
            for city_link in city_links:
                city = city_link.xpath(".//text()").get()
                city_url = city_link.xpath(".//@href").get()
                # 下面通过获取的city_url拼接出新房和二手房的url链接
                # 城市url:https://sz.fang.com/
                # 新房url:https://sz.newhouse.fang.com/house/s/
                # 二手房:https://sz.esf.fang.com/
                url_module = re.split('[.//]',city_url)
                scheme = 'https://'#url_module[0] =http: 使用这个会重定向到https:
                domain = url_module[2]  # cq.fang.com/
                if 'bj' in domain:
                    newhouse_url = 'https://newhouse.fang.com/house/s/'
                    esf_url = 'https://esf.fang.com/'
                else:
                    # 新房url
                    newhouse_url = scheme + domain + ".newhouse." + "fang.com/house/s/"
                    # 二手房url
                    esf_url = scheme + domain + ".esf.fang.com"
                print("新房链接:",newhouse_url)
                print("二手房链接:",esf_url)
       

获取新房页面的信息

 

    def parse_newhouse(self,response):
        #新房
        provice,city = response.meta.get('info')
        lis=response.xpath("//div[contains(@class,'nl_con')]/ul/li")
        for li in lis:
            name=li.xpath('.//div[@class="nlcd_name"]/a/text()').get()
            #print(name)

            if name:
                name = re.sub(r"\s", "", name)
                house_type_list = li.xpath(".//div[contains(@class,'house_type')]/a/text()").getall()
                house_type_list = list(map(lambda x: re.sub(r"\s", "", x), house_type_list))
                rooms = list(filter(lambda x: x.endswith("居"), house_type_list))
                # 面积
                area = "".join(li.xpath(".//div[contains(@class,'house_type')]/text()").getall())
                area = re.sub(r"\s|-|/", "", area)
                # 地址
                address = li.xpath(".//div[@class='address']/a/@title").get()
                address = re.sub(r"[请选择]", "", address)
                sale = li.xpath(".//div[contains(@class,'fangyuan')]/span/text()").get()
                price = "".join(li.xpath(".//div[@class='nhouse_price']//text()").getall())
                price = re.sub(r"\s|广告|\t|\n", "", price)
                # 详情页url
                origin_url = li.xpath(".//div[@class='nlcd_name']/a/@href").get()

                item = NewHouseItem(
                    name=name,
                    rooms=rooms,
                    area=area,
                    address=address,
                    sale=sale,
                    price=price,
                    origin_url=origin_url,
                    provice=provice,
                    city=city
                )
                yield item
       

下一页

meta里面可以携带一些参数信息放到Request里面,在callback函数里面通过response获取

 next_url = response.xpath("//div[@class='page']//a[@class='next']/@href").get()
        if next_url:
            yield scrapy.Request(url=response.urljoin(next_url),
                                 callback=self.parse_newhouse,
                                 meta={'info': (provice, city)}
                                 )

爬取数据发现爬取北京只有 100次大概只爬取了5 6页的样子,通过查找发现了问题

会发现在后面的几页中,已经没有了class=‘next’的a标签,所以我们应该使用其他的方法,分析页面可以发现当你在某一页的时候,该页的span标签的class属性会变成class=‘on’,后面几页依旧如此,所以我们只需要定位到该页的a标签,然后找到它下一个的兄弟节点,就可以提取出来下一页url地址。而在xpath中,便是提供了这一方法

next_url = response.xpath("//div[@class='page']//a[@class='active']/following-sibling::a[1]/@href").get()

修改完数据之后每个城市可以爬取数据1000+条

同理二手房代码如下
next_url = response.xpath("//div[@class='page_al']//span[@class='on']/following-sibling::span[1]/a/@href").get()

代码感觉没啥问题,但是爬取结果还是不对

next_url = response.xpath("//div[@class='page_al']//p[1]/a/@href").extract_first() 有博客是这样写的,get() 、getall() 方法是新的方法,extract_first()、extract() 方法是旧的方法。

 

完整代码

items.py:Item 定义结构化数据字段,用来保存爬取到的数据,有点像Python中的dict,但是提供了一些额外的保护减少错误,可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field的类属性来定义一个Item,以下我创建出NewFangItem和EsfFangItem两个item类,用来存放爬取到的房源信息。

import scrapy


class NewHouseItem(scrapy.Item):
    #省份
    provice = scrapy.Field()
    # 城市
    city = scrapy.Field()
    # 小区
    name = scrapy.Field()
    # 价格
    price = scrapy.Field()
    # 几居,是个列表
    rooms = scrapy.Field()
    # 面积
    area = scrapy.Field()
    # 地址
    address = scrapy.Field()
    # 是否在售
    sale = scrapy.Field()
    # 房天下详情页面的url
    origin_url = scrapy.Field()

class ESFHouseItem(scrapy.Item):
    # 省份
    provice = scrapy.Field()
    # 城市
    city = scrapy.Field()
    # 小区名字
    name = scrapy.Field()
    # 几室几厅
    rooms = scrapy.Field()
    # 层
    floor = scrapy.Field()
    # 朝向
    toward = scrapy.Field()
    # 年代
    year = scrapy.Field()
    # 地址
    address = scrapy.Field()
    # 建筑面积
    area = scrapy.Field()
    # 总价
    price = scrapy.Field()
    # 单价
    unit = scrapy.Field()
    # 详情页url
    origin_url = scrapy.Field()

SfwSpider类spiders/sfw.py 

import scrapy
import re
from fang.items import NewHouseItem,ESFHouseItem

class SfwSpider(scrapy.Spider):
    name = 'sfw'
    allowed_domains = ['fang.com']
    start_urls = ['https://www.fang.com/SoufunFamily.htm']

    def parse(self, response):
        trs=response.xpath('.//div[@class="outCont"]//tr')
        provice = None
        for tr in trs:
            # 排除掉第一个td,两个第二个和第三个td标签
            tds = tr.xpath(".//td[not(@class)]")
            provice_td = tds[0]
            provice_text = provice_td.xpath(".//text()").get()
            # 如果第二个td里面是空值,则使用上个td的省份的值
            provice_text = re.sub(r"\s", "", provice_text)
            if provice_text:
                provice = provice_text
            # 排除海外城市
            if provice == '其它':
                continue
            city_td=tds[1]
            city_links = city_td.xpath(".//a")
            for city_link in city_links:
                city = city_link.xpath(".//text()").get()
                city_url = city_link.xpath(".//@href").get()
                # print("省份:",provice)
                # print("城市:",city)
                # print("城市链接:",city_url)
                # 下面通过获取的city_url拼接出新房和二手房的url链接
                # 城市url:https://sz.fang.com/
                # 新房url:https://sz.newhouse.fang.com/house/s/
                # 二手房:https://sz.esf.fang.com/
                url_module = re.split('[.//]',city_url)
                scheme = 'https://'#url_module[0] =http: 使用这个会重定向到https:
                domain = url_module[2]  # cq.fang.com/
                if 'bj' in domain:
                    newhouse_url = 'https://newhouse.fang.com/house/s/'
                    esf_url = 'https://esf.fang.com/'
                else:
                    # 新房url
                    newhouse_url = scheme + domain + ".newhouse." + "fang.com/house/s/"
                    # 二手房url
                    esf_url = scheme + domain + ".esf.fang.com"
                #print("新房链接:",newhouse_url)
                #print("二手房链接:",esf_url)
                yield scrapy.Request(url=newhouse_url,callback=self.parse_newhouse,
                                     meta={'info': (provice, city)}
                                     )
                yield scrapy.Request(url=esf_url,callback=self.parse_esf,meta={'info': (provice, city)})

            break#只获取了表格中一行城市的数据



    def parse_newhouse(self,response):
        #新房
        provice,city = response.meta.get('info')
        lis=response.xpath("//div[contains(@class,'nl_con')]/ul/li")
        for li in lis:
            name=li.xpath('.//div[@class="nlcd_name"]/a/text()').get()
            #print(name)

            if name:
                name = re.sub(r"\s", "", name)
                house_type_list = li.xpath(".//div[contains(@class,'house_type')]/a/text()").getall()
                house_type_list = list(map(lambda x: re.sub(r"\s", "", x), house_type_list))
                rooms = list(filter(lambda x: x.endswith("居"), house_type_list))
                # 面积
                area = "".join(li.xpath(".//div[contains(@class,'house_type')]/text()").getall())
                area = re.sub(r"\s|-|/", "", area)
                # 地址
                address = li.xpath(".//div[@class='address']/a/@title").get()
                address = re.sub(r"[请选择]", "", address)
                sale = li.xpath(".//div[contains(@class,'fangyuan')]/span/text()").get()
                price = "".join(li.xpath(".//div[@class='nhouse_price']//text()").getall())
                price = re.sub(r"\s|广告|\t|\n", "", price)
                # 详情页url
                origin_url = li.xpath(".//div[@class='nlcd_name']/a/@href").get()

                item = NewHouseItem(
                    name=name,
                    rooms=rooms,
                    area=area,
                    address=address,
                    sale=sale,
                    price=price,
                    origin_url=origin_url,
                    provice=provice,
                    city=city
                )
                yield item
        #next_url = response.xpath("//div[@class='page']//a[@class='next']/@href").get()
        next_url = response.xpath("//div[@class='page']//a[@class='active']/following-sibling::a[1]/@href").get()
        next_url = response.urljoin(next_url)
        if next_url:
            yield scrapy.Request(url=response.urljoin(next_url),
                                 callback=self.parse_newhouse,
                                 meta={'info': (provice, city)}
                                 )

    def parse_esf(self,response):
        #二手房
        provice, city = response.meta.get('info')
        dls = response.xpath("//div[@class='shop_list shop_list_4']/dl")
        for dl in dls:
            item = ESFHouseItem(provice=provice, city=city)
            name=dl.xpath(".//span[@class='tit_shop']/text()").get()
            if name:
                name = re.sub(r"\s", "", name)
                print(name)
                infos = dl.xpath(".//p[@class='tel_shop']/text()").getall()
                infos = list(map(lambda x: re.sub(r"\s", "", x), infos))

                for info in infos:
                    if "厅" in info:
                        item["rooms"] = info
                    elif '层' in info:
                        item["floor"] = info
                    elif '向' in info:
                        item['toward'] = info
                    elif '㎡' in info:
                        item['area'] = info
                    elif '年建' in info:
                        item['year'] = re.sub("年建", "", info)
                item['address'] = dl.xpath(".//p[@class='add_shop']/span/text()").get()
                # 总价
                price= "".join(dl.xpath(".//span[@class='red']//text()").getall())
                price = re.sub(r"\s|广告|\t|\n", "", price)
                item['price'] =price
                # 单价
                item['unit'] = dl.xpath(".//dd[@class='price_right']/span[2]/text()").get()
                item['name'] = name
                detail = dl.xpath(".//h4[@class='clearfix']/a/@href").get()
                item['origin_url'] = response.urljoin(detail)
                print(item)
                yield  item
            #下一页
            next_url = response.xpath("//div[@class='page_al']//span[@class='on']/following-sibling::span[1]/a/@href").get()
            #next_url = response.xpath("//div[@class='page_al']/p/a/@href").get()
            if next_url:
                yield scrapy.Request(url=response.urljoin(next_url),
                                     callback=self.parse_esf,
                                     meta={'info': (provice, city)}
                                     )

pipelines.py:当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item。以下pipeline将所有(从所有’spider’中)爬取到的item,存储到csv、json中(也可以存储到mysql数据库等文件中需要先创建好数据库和数据表),: 

注意:我们使用了NewHouseItem,ESFHouseItem需要在代码中加入以下语句确保数据不会混合存储,我之前看网上很多代码不包含此句,得到的文件里面既有新房数据又有二手房数据

if isinstance(item, NewHouseItem):
            self.newhouse_exporter.export_item(item)

from scrapy.exporters import JsonLinesItemExporter
from fang.items import NewHouseItem,ESFHouseItem
import csv
class FangPipeline:
    def __init__(self):
        self.newhouse_fp = open('newhouse.json', 'wb')
        self.esfhouse_fp = open('esfhouse.json', 'wb')
        self.newhouse_exporter = JsonLinesItemExporter(self.newhouse_fp, ensure_ascii=False)
        self.esfhouse_exporter = JsonLinesItemExporter(self.esfhouse_fp, ensure_ascii=False)

    def process_item(self, item, spider):
        if isinstance(item, NewHouseItem):
            self.newhouse_exporter.export_item(item)
        elif isinstance(item, ESFHouseItem):
            self.esfhouse_exporter.export_item(item)
        return item

    def close_spider(self, spider):
        self.newhouse_fp.close()
        self.esfhouse_fp.close()

class FangCSVPipeline(object):
    def __init__(self):
        print("开始写入...")
        self.f1 = open('new_house.csv', 'w', newline='')
        self.write1 = csv.writer(self.f1)
        self.write1.writerow(["城市", "小区名称", "价格", "几居",
                              "面积", "地址", "行政区", "是否在售", "详细url"])

        self.f2 = open('esf_house1.csv', 'w', newline='')
        self.write2 = csv.writer(self.f2)
        self.write2.writerow(["城市", "小区的名字", "几居", "层", "朝向",
                              "年代", "地址", "建筑面积", "总价", "单价", "详细的url"])

        self.f3 = open('rent_house.csv', 'w', newline='')
        self.write3 = csv.writer(self.f3)
        self.write3.writerow(['城市', '标题', '房间数', '平方数',
                              '价格', '地址', '交通描述', '区', '房间朝向'])



    def process_item(self, item, spider):
        print("正在写入...")
        if isinstance(item, NewHouseItem):
            self.write1.writerow([item['city'], item['name'], item['price'],
                                  item['rooms'], item['area'], item['address'], item['district'], item['sale']
                                     , item['origin_url']])
        elif isinstance(item, ESFHouseItem):
            self.write2.writerow([item['city'], item['name'], item['rooms'],
                                  item['floor'], item['toward'], item['year'], item['address'], item['area']
                                     , item['price'], item['unit'], item['origin_url']])
        return item# elif isinstance(item, RenthousescrapyItem):
        #     self.write3.writerow([item['city'], item['title'], item['rooms'], item['area'], item['price']
        #                              , item['address'], item['traffic'], item['region'],
        #                           item['direction']])

    def close_spider(self, item, spider):
        print("写入完成...")
        self.f1.close()
        self.f2.close()
        #self.f3.close()

middleware.py:下载中间件是处于引擎(crawler.engine)和下载器(crawler.engine.download())之间的一层组件,可以有多个下载中间件被加载运行。当引擎传递请求给下载器的过程中,下载中间件可以对请求进行处理 (例如增加http header信息,增加proxy信息等);在下载器完成http请求,传递响应给引擎的过程中, 下载中间件可以对响应进行处理(例如进行gzip的解压等)
设置随机请求头减小被反爬虫识别的概率(也可以增加使用代理ip),编写完后需要在setting中进行配置:
 

import random
class UserAgentDownloadMiddleware(object):
    USER_AGENTS = [
        'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36',
        'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0 ',
        'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36',
        'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER',
    ]

    def process_request(self,request,spider):
        user_agent = random.choice(self.USER_AGENTS)
        request.headers['User-Agent'] = user_agent

settings.py:Scrapy设置(settings)提供了定制Scrapy组件的方法。可以控制包括核心(core),插件(extension),pipeline及spider组件。比如 设置Json Pipeliine、LOG_LEVEL等。
进行配置:ROBOTSTXT_OBEY = False
开启item_pipelne:ITEM_PIPELINES = { 'fang.pipelines.FangPipeline': 300, }

开启下载器中间件

DOWNLOADER_MIDDLEWARES = {
   'fang.middlewares.UserAgentDownloadMiddleware': 543,
}

完成代码后运行start文件

如发现其他问题或有解决错误的方法可以评论或者私信

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬虫实战-爬取房天下网站全国所有城市的新房和二手房信息(最新) 的相关文章

  • 爬虫之数据的提取 使用XPath 及lxml 初学者必备

    一 XPATH是什么 xff1f 干什么用的 xff1f xpath xff08 XML Path Language xff09 是一门在XML和HTML文档中查找信息的语言 xff0c 可用来在XML和HTML文档中对元素和属性进行遍历
  • 刷题之sum-closest

    给定一个包括 n 个整数的数组 nums 和 一个目标值 target 找出 nums 中的三个整数 xff0c 使得它们的和与 target 最接近 返回这三个数的和 假定每组输入只存在唯一答案 示例 xff1a 输入 xff1a num
  • 使用requests和xpath爬取电影天堂

    import requests from lxml import etree from openpyxl import Workbook URL 61 39 https dytt8 net html gndy dyzz list 23 1
  • day4数组之 删除排序数组中的重复项

    26删除排序数组中的重复项 给定一个排序数组 xff0c 你需要在 原地 删除重复出现的元素 xff0c 使得每个元素只出现一次 xff0c 返回移除后数组的新长度 不要使用额外的数组空间 xff0c 你必须在 原地 修改输入数组 并在使用
  • 爬虫之BeautifulSoup4库详解

    BeautifulSoup4库 和 lxml 一样 xff0c Beautiful Soup 也是一个HTML XML的解析器 xff0c 主要的功能也是如何解析和提取 HTML XML 数据 lxml 只会局部遍历 xff0c 而Beau
  • 在 VirtualBox 中安装 Debian 虚拟机

    在 VirtualBox 中安装 Debian 虚拟机 手把手一步一步带你在VirtualBox中安装Debian虚拟机 xff1b 打开VirtualBox软件点击新建 xff1a 配置信息 xff08 示例 xff09 xff1a 名称
  • 爬虫中国天气网数据并可视化

    中国天气网爬虫数据可视化 爬虫功能网页分析 以华北地区为例分析网页源代码 1 以谷歌浏览器为例分析2 提取特征标签3 分析源代码利用requests库获取目标网页源代码利用BeautifulSoup库提取天气信息港澳台地区代码分析分析数据数
  • day5刷题之 删除排序数组中的重复项 II

    80 删除排序数组中的重复项 II 难度中等361 给定一个增序排列数组 nums xff0c 你需要在 原地 删除重复出现的元素 xff0c 使得每个元素最多出现两次 xff0c 返回移除后数组的新长度 不要使用额外的数组空间 xff0c
  • day7刷题之二分搜索2

    33 搜索旋转排序数组 难度中等1187收藏分享切换为英文接收动态反馈 升序排列的整数数组 nums 在预先未知的某个点上进行了旋转 xff08 例如 xff0c 0 1 2 4 5 6 7 经旋转后可能变为 4 5 6 7 0 1 2 x
  • day6刷题之二分搜索1

    二分查找代码 class Solution public int searchInsert int nums int target int left 61 0 right 61 nums length 1 注意循环条件 while left
  • 正则表达式补充篇

    1 re match和re search match 和search 的区别 xff1a match xff08 xff09 函数只检测RE是不是在string的开始位置匹配 xff0c search 会扫描整个string查找匹配matc
  • 爬虫实战之爬取古诗文网站 (详细)

    爬取古诗文网站 重点是练习正则表达式的使用 链接变化 url base 61 39 https www gushiwen cn default aspx 39 for i in range 1 2 print 39 正在爬取第 页 xff1
  • 利用Python爬取糗事百科段子信息

    有个博客很详细https blog csdn net weixin 42488570 article details 80794087 要求 xff1a 用户ID xff0c 用户等级 xff0c 用户性别 xff0c 发表段子文字信息 x
  • 爬虫之数据存储(json,csv,mysql)等

    JSON支持数据格式 xff1a 对象 xff08 字典 xff09 使用花括号 数组 xff08 列表 xff09 使用方括号 整形 浮点型 布尔类型还有null类型 字符串类型 xff08 字符串必须要用双引号 xff0c 不能用单引号
  • MongoDB的安装及配置服务及使用

    安装配置 https blog csdn net heshushun article details 77776706 1 先在安装目录data文件下创建一个新文件夹log xff08 用来存放日志文件 xff09 2 在Mongodb安装
  • python多线程学习

    Python3 线程中常用的两个模块为 xff1a thread xff08 已经废弃 xff09 threading 推荐使用 线程模块 Python3 通过两个标准库 thread 和 threading 提供对线程的支持 thread
  • 爬虫实战之多线程下载表情包

    一般下载 import requests from lxml import etree import os import re from urllib request import urlretrieve headers 61 39 Use
  • 卷积padding,kernel_initializer

    TensorFlow和 keras layers convolutional Conv1D和tf layers Conv1D函数 keras layers convolutional Conv1D filters kernel size s
  • python刷题之链表常见操作

    链表常用操作 也可以把列表当做队列用 xff0c 只是在队列里第一加入的元素 xff0c 第一个取出来 xff1b 但是拿列表用作这样的目的效率不高 在列表的最后添加或者弹出元素速度快 xff0c 然而在列表里插入或者从头部弹出速度却不快
  • 刷题之链表

    链表相关 19 删除链表的倒数第 N 个结点 难度中等1261收藏分享切换为英文接收动态反馈 给你一个链表 xff0c 删除链表的倒数第 n 个结点 xff0c 并且返回链表的头结点 进阶 xff1a 你能尝试使用一趟扫描实现吗 xff1f

随机推荐

  • 高级爬虫: 使用 Selenium 浏览器

    安装Selenium和chromedriver xff1a 因为 Selenium 需要操控你的浏览器 所以安装起来比传统的 Python 模块要多几步 先在 terminal 或者 cmd 用 pip 安装 selenium python
  • python刷题之栈和队列

    20 有效的括号 难度简单2228 给定一个只包括 39 39 xff0c 39 39 xff0c 39 39 xff0c 39 39 xff0c 39 39 xff0c 39 39 的字符串 s xff0c 判断字符串是否有效 有效字符串
  • python实现堆的基本操作及堆相关练习

    堆 heap 又被为优先队列 priority queue 尽管名为优先队列 xff0c 但堆并不是队列 回忆一下 xff0c 在队列中 xff0c 我们可以进行的限定操作是dequeue和enqueue dequeue是按照进入队列的先后
  • python刷题之集合、哈希表常见操作及练习

    集合 集合是一个无序不重复元素的集 基本功能包括关系测试和消除重复元素 可以用大括号 创建集合 注意 xff1a 如果要创建一个空集合 xff0c 你必须用 set 而不是 xff1b 后者创建一个空的字典 xff0c 下一节我们会介绍这个
  • 用selenium爬取拉勾网职位信息及常见问题处理

    初步爬虫框架构造 下面采用selenium进行爬虫 xff0c 首先构造一下爬虫的框架 xff0c 将整个程序构造为一个类 xff0c 其中主要包括 xff1a 获取每个详细职位信息的链接 xff08 parse page url xff0
  • Scrapy爬虫快速入门

    Scrapy快速入门 Scrapy框架模块功能 xff1a Scrapy Engine xff08 引擎 xff09 xff1a Scrapy框架的核心部分 负责在Spider和ItemPipeline Downloader Schedul
  • 嵌入式系统USB CDROM虚拟光驱驱动程序开发

    带U盘功能的的USB接口设备已经越来越常见了 如果能够把产品说明书或者产品设备驱动程序做成一个USB CDROM xff0c 那该多方便 假设 xff1a 你已经有了USB mass storage驱动 你的任务是在此基础上增加一个USB
  • Redis集群原理详解

    一 Redis集群介绍 xff1a 1 为什么需要Redis集群 xff1f 在讲Redis集群架构之前 xff0c 我们先简单讲下Redis单实例的架构 xff0c 从最开始的一主N从 xff0c 到读写分离 xff0c 再到Sentin
  • python刷题之快慢指针与二分查找

    141 环形链表 难度简单986 给定一个链表 xff0c 判断链表中是否有环 如果链表中有某个节点 xff0c 可以通过连续跟踪 next 指针再次到达 xff0c 则链表中存在环 为了表示给定链表中的环 xff0c 我们使用整数 pos
  • LeetCode每日一题

    191 位1的个数 难度简单290 编写一个函数 xff0c 输入是一个无符号整数 xff08 以二进制串的形式 xff09 xff0c 返回其二进制表达式中数字位数为 39 1 39 的个数 xff08 也被称为汉明重量 xff09 提示
  • scrapy模拟豆瓣登录

    看的课程是21天搞定分布式爬虫 xff0c 应该是几年前的了 xff0c 课程当时还是验证码 xff0c 现在登录和之前都不一样了现在需要你拖动滑块完成拼图 之前的页面 现在验证码都变成拼图了 学学原理吧 首先创建scrapy项目 首先进入
  • 利用Scrapy框架爬取汽车之家图片(详细)

    爬取结果 爬取步骤 创建爬虫文件 进入cmd命令模式下 xff0c 进入想要存取爬虫代码的文件 xff0c 我这里是进入e盘下的E pystudy scraping文件夹内 C Users wei gt E E gt cd E pystud
  • Scrapy框架下载器和随机请求头

    下载器中间键可以为我们设置多个代理ip与请求头 xff0c 达到反反爬虫的目的 下面是scrapy为我们创建好的中间件的类 Process request self request spider 参数 request 发送请求的reques
  • scrapy爬取完整网页完整数据,简书(最新)

    需求 xff1a 简书网站整站爬虫 数据保存到mysql数据库中 将seleniume 43 chromedriver集成到scrapy 爬取结果如下 xff1a 安装Selenium和chromedriver xff1a https bl
  • 图和图的基本知识

    1 1 图的表示 1 2 图的特性 子图Subgraph 连通分量Connected Component 接通图Connected Graph 最短路径Shortest Path 图直径Diameter 1 3 图中心性 Centralit
  • BFS和DFS的python实现(要记住)

    BFS DFS python模板与实现 BFS模板 1 无需分层遍历 while queue 不空 xff1a cur 61 queue pop for 节点 in cur的所有相邻节点 xff1a if 该节点有效且未访问过 xff1a
  • BFS与 DFS题目练习(python)

    107 二叉树的层序遍历 II 难度中等423 给定一个二叉树 xff0c 返回其节点值自底向上的层序遍历 xff08 即按从叶子节点所在层到根节点所在的层 xff0c 逐层从左向右遍历 xff09 例如 xff1a 给定二叉树 3 9 2
  • LeetCode每日一题-合并两个有序数组

    88 合并两个有序数组 难度简单878 给你两个有序整数数组 nums1 和 nums2 xff0c 请你将 nums2 合并到 nums1 中 xff0c 使 nums1 成为一个有序数组 初始化 nums1 和 nums2 的元素数量分
  • debian 系统无声音

    系统识别了硬件 xff0c 加载了内核 可是就是没声音 在基础条件都满足的情况下 xff0c 尝试输入 xff1a sudo alsactl init 反正我是一输入声音就出来了 转载于 https my oschina net skyoo
  • 爬虫实战-爬取房天下网站全国所有城市的新房和二手房信息(最新)

    看到https www cnblogs com derek1184405959 p 9446544 html项目 xff1a 爬取房天下网站全国所有城市的新房和二手房信息和其他博客的代码 xff0c 因为网站的更新或者其他原因都不能正确爬取