天天看點

網絡爬蟲,爬取二手房源

作者:從事java的小白

一、相信有很多朋友在學習python後,一定都有過使用這門語言編寫爬蟲的想法。剛剛學習了python的小白(因為很白是以叫小白)我也是如此。這裡小白和小白的夥伴就以python新手的身份分享一下我們使用python爬蟲爬取二手房網的房源資訊的過程。如有大佬路過,求大佬指出其中需要改進的地方,小白我感激不盡。

編寫爬蟲之前,我們首先應該搞清楚爬蟲到底是幹什麼的。這裡語言表達力不足的小白隻好借用度娘上的答案向大家介紹一下:

網絡爬蟲,又被稱為網頁蜘蛛,網絡機器人,在FOAF社群中間,更經常的稱為網頁追逐者,是一種按照一定的規則,自動地抓取網際網路資訊的程式或者腳本,另外一些不常使用的名字還有螞蟻、自動索引、模拟程式或者蠕蟲。

大概了解爬蟲後,我們就要開始做編寫爬蟲的準備工作了。首先是我們已經确定是用python語言進行編寫,然後我們就要确定使用什麼開發平台和環境了,這裡,小白使用的是Windows平台 (準備之前查了一些資料,看到一些大佬說就開發而言,linux比windows用起來舒服,是以大家也可以試試linux),開發環境是pycharm2021社群版(開始下載下傳了專業版,但是發現每天打開都需要輸入激活碼,并且對于我們一般人來說社群版也夠用了,于是重新下載下傳了社群版)。

接下來應該就是要準備編寫爬蟲了,其實,在小白看來,編寫爬蟲其實就是各種庫的應用。首先說一下我們的大概思路:爬取資料——解析資料——存儲資料。第一步我們需要安裝我們需要的庫,安裝方法網上很多,這裡就不具體說了。接下來是導入我們需要的庫,導入庫的語句為 import +庫;例如在我的代碼中需要的庫導入如下:

網絡爬蟲,爬取二手房源
# -*- coding: utf-8 -*-
from urllib import request
import re
import time
import threading
import random
import pymysql
from hashlib import md5
#from ua_info import ua_list
from fake_useragent import UserAgent
import sys

class study():

    def __init__(self):
        self.url='https://bj.lianjia.com/ershoufang/pg{}/'

    # 1.請求函數
    def get_html(self, url):
        ua=UserAgent()
        #print(ua.chrome)
        headers = {'User-Agent': ua.chrome}
        req = request.Request(url=url, headers=headers)
        res = request.urlopen(req)
        # 本網站使用utf8的編碼格式
        html = res.read().decode('utf8', 'ignore')
        return html

    # 2.正則解析函數
    def re_func(self,re_bds,html):
        pattern = re.compile(re_bds,re.S)
        r_list = pattern.findall(html)

        return r_list
    # 格式化,正規表達式比對頁面
    def parse_html(self,one_url):
        # 調用請求函數,擷取一級頁面
        one_html = self.get_html(one_url)
        #print(one_html)
        #re_bds = '<a class="" .*?data-el="ershoufang".*?>(.*?)</a>'
        #re_bds='<div class="info clear">.*?</div>'
        #re_bds='<div class="title"><a.*?data-el="ershoufang".*?>(.*?)</a>.*?<span class="goodhouse_tag tagBlock">(.*?)</span></div>'
        re_bds='<div class="info clear"><div class="title"><a.*?data-el="ershoufang".*?>(.*?)</a>.*?<span class="goodhouse_tag tagBlock">(.*?)</span></div><div class="flood"><div class="positionInfo"><span class="positionIcon"></span><a .*?data-el="region">(.*?)</a>   -  <a href="https://bj.lianjia.com/ershoufang/(.*?)/" target="_blank">(.*?)</a> </div></div><div class="address"><div class="houseInfo"><span class="houseIcon"></span>(.*?)</div></div><div class="followInfo"><span class="starIcon"></span>(.*?)</div><div class="tag">(.*?)</div><div class="priceInfo"><div class="totalPrice totalPrice2"><i> </i><span class="">(.*?)</span><i>萬</i></div><div class="unitPrice".*?><span>(.*?)</span></div></div></div>'
        link_list = self.re_func(re_bds,one_html)
        print(link_list)
        for link in link_list:
            print (link)
            print(100*'*')
    #對于部分正常可以擷取到最大頁碼數,可以采用
    def get_max_page(self,one_url):
        one_html = self.get_html(one_url)
        print(one_html)
        re_bds = '<a href="/ershoufang/pg(.*?)" data-page="(.*?)">(.*?)</a>'
        print(re_bds)
        link_list = self.re_func(re_bds,one_html)
        #print(link_list)
        return link_list[link_list.__len__()-1][1];

    def run(self):
        for i in range(100):
            url = self.url.format(i)
            #定時抓取目前最新的資料
            self.parse_html(url)
        # 輸出當地時間
        print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))  
        # 設定一個定時器,循環輸出時間
        timer = threading.Timer(6*60*60, self.run)  
        # 啟動線程
        timer.start() 
        #self.parse_html('https://bj.lianjia.com/ershoufang/pg1/')

if __name__ == '__main__':
    spider = study()
    spider.run()    

           
網絡爬蟲,爬取二手房源
網絡爬蟲,爬取二手房源
網絡爬蟲,爬取二手房源