一、相信有很多朋友在學習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()