python爬虫实战,爬取洛杉矶上千房源!
前言 最近打算簽證流程結(jié)束后,開始看看加州的房子了,畢竟研究生是不太容易住校內(nèi)的,具體來說還是看看洛杉磯的房源。因?yàn)榫W(wǎng)站在國外,訪問比較慢,不同頁的也不好比較,于是想著把它全部爬取下來整理成docx文檔,便于搜索和直接篩選,比如價(jià)格太高的直接刪掉,剩下的就是滿足需求的房源了。 本文簡單分析下代碼后將所有源碼和文件公開,大家各取所需~?
python庫
| python-docx | 0.8.11 |
| requests | 2.21.0 |
| lxml | 4.6.2 |
| bs4 | 0.0.1 |
其中:
- python-docx庫用于操作docx文件,將爬取的信息保存下來
- requests發(fā)送網(wǎng)絡(luò)請(qǐng)求
- lxml中的etree用于通過Xpath查找想要的頁面元素
- bs4用于定位網(wǎng)頁源碼中的元素并統(tǒng)一篩選
房源平臺(tái)
本代碼中爬取的對(duì)象是?www.apartments.com?和?https://tripalink.com/,想必留學(xué)生們都對(duì)這兩個(gè)網(wǎng)站非常熟悉。經(jīng)測(cè)試,兩個(gè)網(wǎng)站均無任何反爬機(jī)制,畢竟是公開的第三方平臺(tái),房源入駐打廣告,也沒有什么私有資料,既然給爬那隨便爬。。。
開始
1.導(dǎo)入庫
首先我們導(dǎo)入python庫
?
?
#coding=utf-8 import os import re import docx import urllib import requestsfrom datetime import * from lxml import etree from bs4 import BeautifulSoupfrom docx import Document from docx.shared import Inches, Cm from docx.enum.text import WD_PARAGRAPH_ALIGNMENT from docx.enum.table import WD_TABLE_ALIGNMENT from docx.enum.dml import MSO_THEME_COLOR_INDEX?
結(jié)尾版式
先引入一個(gè)docx文件里的末尾版式添加函數(shù),不理解的可以先不看,后面會(huì)用到:
?
?
def endnote(document):p = document.add_paragraph('歡迎點(diǎn)贊收藏關(guān)注~')p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTERp = document.add_paragraph('https://blog.csdn.net/weixin_42815846')p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTERdocument.add_picture('比心.png', width=Inches(1))document.paragraphs[-1].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER?
2.請(qǐng)求函數(shù)
再進(jìn)入一個(gè)頁面獲取函數(shù),此函數(shù)的輸入為頁面的url鏈接,返回頁面內(nèi)容,其中headers可以根據(jù)自己瀏覽器的具體信息來修改,當(dāng)然也可以不改,作用就是偽裝自己,讓網(wǎng)站以為你是瀏覽器訪問,而不是python源碼在請(qǐng)求數(shù)據(jù)。
?
?
def getHtml(url): # 借助user-agentheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36'}# 借助requests獲取響應(yīng)對(duì)象response = requests.get(url=url, headers=headers)# 從響應(yīng)對(duì)象中獲取響應(yīng)內(nèi)容# 設(shè)置編碼格式response.encoding = "utf-8"return response.text?
3.Xpath提取信息 既然已經(jīng)把頁面請(qǐng)求到手,那可以通過Xpath進(jìn)行搜索我們想要的信息了,代碼如下。不懂Xpath可以先搜一搜Xpath的用法,再返回來看此代碼。此代碼爬取了 www.apartments.com 上加州洛杉磯的房源信息,第一個(gè)循環(huán)中的page范圍為1-28,因?yàn)樵谧髡吲廊r(shí)該地方的房源有28頁,因此循環(huán)進(jìn)行爬取。
?
?
for page in range(1, 29):print(f"第{page}頁")html = getHtml(f'https://www.apartments.com/los-angeles-ca/{page}/') bs4 = BeautifulSoup(html, 'html.parser')# 根據(jù)屬性結(jié)構(gòu)獲取內(nèi)容content = bs4.find_all(name="li", attrs={"class": "mortar-wrapper"})selecter=etree.HTML(html)for index in range(1, len(content)+1):title = selecter.xpath(f'//*[@id="placardContainer"]/ul/li[{index}]/article/header/div[1]/a/div[1]/span')[0].xpath('string(.)')addr = selecter.xpath(f'//*[@id="placardContainer"]/ul/li[{index}]/article/header/div[1]/a/div[2]')[0].xpath('string(.)')# 房屋鏈接roomlink = selecter.xpath(f'//*[@id="placardContainer"]/ul/li[{index}]/article')[0].xpath('@data-url')[0]rooms.append([title, addr, roomlink])prefix = selecter.xpath(f'//*[@id="placardContainer"]/ul/li[{index}]/article/section/div')[0]# 圖片鏈接picsrc = prefix.xpath('./div[1]/div[2]/div[2]/ul/li[1]/a')picsrc = picsrc[0].xpath('@href')[0] if len(picsrc)>0 else "無"# Virtual TourVRtour = prefix.xpath('./div[1]/div[2]/div[2]/ul/li[2]/a')VRtour = VRtour[0].xpath('@href')[0] if len(VRtour)>0 else "無"# 免租freeRent = prefix.xpath('./div[2]/div/div[1]/div')freeRent = freeRent[0].xpath('@data-specials-label')[0] if len(freeRent)>0 else "否"# 價(jià)格price = prefix.xpath('./div[2]/div/div[2]/div')[0].xpath('string(.)')# 類型roomtype = prefix.xpath('./div[2]/div/div[3]/div[1]')[0].xpath('string(.)')# 是否可用available = prefix.xpath('./div[2]/div/div[3]/div[2]')[0].xpath('string(.)')# 便利設(shè)施amenities = []for i, per1 in enumerate(prefix.xpath('./div[2]/div/div[4]/span')):amenities.append(per1.xpath('string(.)'))# 電話telephone = prefix.xpath('./div[2]/div/div[5]/a/span')telephone = telephone[0].xpath('string(.)') if len(telephone)>0 else "無"rooms[-1].extend([picsrc, VRtour, freeRent, price, roomtype, available, amenities, telephone])?
可見,在代碼中爬取了房源的很多信息:房屋名、房屋鏈接、內(nèi)部圖片鏈接、VR看房、免租信息、價(jià)格、住房類型、可用性、便利設(shè)施以及聯(lián)系電話等。其中圖片鏈接還可以進(jìn)一步將圖片爬取下來,但是為了docx文檔的組織便利性,僅將鏈接保存下來?(畢竟它給你看的多半不是實(shí)際的樣子。。
4.存入docx
最后利用如下函數(shù)將所有信息存入docx,用到了Document類。其中add_heading表示加標(biāo)題,第二個(gè)參數(shù)中的0表示0號(hào)標(biāo)題,1表示1號(hào)標(biāo)題;add_paragraph表示加一個(gè)段落;用到了add_table添加表格,以及居中、合并、設(shè)置列寬等操作。
?
?
def apartments2docx(data):document = Document()header = 'LA lease from www.apartments.com {}'.format(datetime.now().strftime('%a, %b %d %H:%M'))document.add_heading(header, 0)names = ['房屋類型', 'Availability', '價(jià)格', '是否免租', '便利設(shè)施', '室內(nèi)概覽', 'VR看房', '房屋鏈接', '聯(lián)系方式']orders = [7, 8, 6, 5, 9, 3, 4, 2, 10]for i, room in enumerate(data):document.add_heading(f"{i+1}. "+room[0], 1)document.add_paragraph(room[1])table = document.add_table(rows=10, cols=2, style='Table Grid')for index, column in enumerate(table.columns):for cell in column.cells:cell.width = Inches(1) if index == 0 else Inches(5)table.cell(0,0).merge(table.cell(0,1))for row, obj_row in enumerate(table.rows):if row == 0:obj_row.cells[0].text = "租賃信息"else:x = orders[row-1]obj_row.cells[1].text = room[x] if x != 9 else '、'.join(room[x])obj_row.cells[0].text = names[row-1]table.cell(0,0).paragraphs[0].paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTERdocument.add_paragraph('')endnote(document)document.save('ApartmentsRooms.docx')?
如有報(bào)錯(cuò)Failed to establish a new connection: [WinError 10060] 由于連接方在一段時(shí)間后沒有正確答復(fù)或連接的主機(jī)沒有反應(yīng),連接嘗試失敗。')),換一個(gè)headers可以解決,可能網(wǎng)站還是有對(duì)一個(gè)客戶端請(qǐng)求的回應(yīng)上限 效果展示。
小結(jié)(附源碼)
本代碼中對(duì)tripalink的爬取不再贅述,唯一不同的是沒用Xpath,而是直接對(duì)BeautifulSoup對(duì)象進(jìn)行操作。
近期有很多朋友通過私信咨詢有關(guān)Python學(xué)習(xí)問題。為便于交流,點(diǎn)擊藍(lán)色自己加入討論解答資源基地
?
總結(jié)
以上是生活随笔為你收集整理的python爬虫实战,爬取洛杉矶上千房源!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阅读(英文)大部头教材遇到了困难...
- 下一篇: xorm oracle,Golang +