python爬蟲需要學習那些知識呢?學習一些抓包知識,有些網站防爬,需要人工瀏覽一些頁面,抓取數據包分析防爬機制,然後做出應對措施。比如解決cookie問題,或者模擬設備等。不過對前端也要比較熟悉,比如說html和簡單的js和web框架什麼的。現在我們用Python爬取租房網站信息,來學習pyhton。
豬短租是一個租房網站,上面有很多優質的民宿出租信息,下面我們以成都地區的租房信息為例,來嘗試爬取這些數據。
1.爬取租房標題
按照慣例,先來爬下標題試試水,找到標題,複製xpath。
多複製幾個房屋的標題 xpath 進行對比:
//*[@id="page_list"]/ul/li[1]/div[2]/div/a/span
//*[@id="page_list"]/ul/li[2]/div[2]/div/a/span
//*[@id="page_list"]/ul/li[3]/div[2]/div/a/span
瞬間發現標題的 xpath 只在
· 後序號變化,於是,秒寫出爬取整頁標題的 xpath:
//*[@id=“page_list”]/ul/li/div[2]/div/a/span
·1
還是固定的套路,讓我們嘗試把整頁的標題爬下來:
小豬在IP限制方面比較嚴格,代碼中務必要加入 sleep() 函數控制爬取的頻率
好了,再來對比下 xpath 信息
順著標題的標籤網上找,找到整個房屋信息標籤, xpath 對比如下:
//*[@id=“page_list”]/ul/li #整體
//*[@id=“page_list”]/ul/li/div[2]/div/a/span #標題
你應該知道該怎麼來改代碼了吧,寫一個循環:
file=s.xpath(‘//*[@id=“page_list”]/ul/li’)
for div in file:
title=div.xpath("./div[2]/div/a/span/text()")[0]
好了,來運行一下試試:
2.爬取多個元素的信息
對比其他元素的 xpath:
//*[@id=“page_list”]/ul/li #整體
//*[@id=“page_list”]/ul/li/div[2]/div/a/span #標題
//*[@id=“page_list”]/ul/li/div[2]/span[1]/i #價格
//*[@id=“page_list”]/ul/li/div[2]/div/em #描述
//*[@id=“page_list”]/ul/li/a/img #圖片
然後可以寫出代碼:
file=s.xpath(“//*[@id=“page_list”]/ul/li”)
for div in file:
title=div.xpath(“./div[2]/div/a/span/text()”)[0]
price=div.xpath(“./div[2]/span[1]/i/text()”)[0]
scrible=div.xpath(“./div[2]/div/em/text()”)[0].strip()
pic=div.xpath(“./a/img/@lazy_src”)[0]
來嘗試運行一下:
3.翻頁,爬取更多頁面
看一下翻頁時候 url 的變化:
http://cd.xiaozhu.com/search-duanzufang-p1-0/ #第一頁
http://cd.xiaozhu.com/search-duanzufang-p2-0/ #第二頁
http://cd.xiaozhu.com/search-duanzufang-p3-0/ #第三頁
http://cd.xiaozhu.com/search-duanzufang-p4-0/ #第四頁
……………………
url 變化的規律很簡單,只是 p 後面的數字不一樣而已,而且跟頁碼的序號是一模一樣的,這就很好辦了……寫一個簡單的循環來遍歷所有的url。
for a in range(1,6):
url = ‘http://cd.xiaozhu.com/search-duanzufang-p{}-0/’.format(a)
# 我們這裡嘗試5個頁面,你可以根據自己的需求來寫爬取的頁面數量
完整的代碼如下:
from lxml import etree
import requests
import time
for a in range(1,6):
url = 'http://cd.xiaozhu.com/search-duanzufang-p{}-0/'.format(a)
data = requests.get(url).text
s=etree.HTML(data)
file=s.xpath('//*[@id="page_list"]/ul/li')
time.sleep(3)
for div in file:
title=div.xpath("./div[2]/div/a/span/text()")[0]
price=div.xpath("./div[2]/span[1]/i/text()")[0]
scrible=div.xpath("./div[2]/div/em/text()")[0].strip()
pic=div.xpath("./a/img/@lazy_src")[0]
print("{} {} {} {}\n".format(title,price,scrible,pic))
看一下爬了5個頁面下來的效果:
相信你已經掌握爬蟲基本的套路了,但你還需要去不斷熟悉,能獨立寫出代碼為止。
寫代碼不僅要細心,也需要耐心。很多人從入門到放棄,並不是因為編程這件事情有多難,而是某次實踐過程中,遇到一個小問題。
下面我們再來爬取300個房源信息
爬取網頁上300個房源信息,包括標題,地址,日租金,第一張房源圖片鏈接,房東圖片鏈接,房東性別,房東名字
代碼
from bs4 import BeautifulSoup
import requests
# 判斷性別
def get_sex(sex_icon):
if sex_icon == ['member_ico']:
return "男"
if sex_icon == ['member_ico1']:
return "女"
else:
return "未標識"
# 獲取每頁的url鏈接
def get_page_url(url):
web_url = requests.get(url)
web_url_soup = BeautifulSoup(web_url.text,'lxml')
page_urls = web_url_soup.select('#page_list > ul > li > a')
for page_url in page_urls:
each_url = page_url.get('href')
get_detail_info(each_url)
def get_detail_info(url):
web_data = requests.get(url)
soup = BeautifulSoup(web_data.text,'lxml')
titles = soup.select('body > div.wrap.clearfix.con_bg > div.con_l > div.pho_info > h4 > em')
addresses = soup.select('body > div.wrap.clearfix.con_bg > div.con_l > div.pho_info > p > span.pr5')
prices = soup.select('#pricePart > div.day_l > span')
pics1 = soup.select('#curBigImage')
owner_pics = soup.select('#floatRightBox > div.js_box.clearfix > div.member_pic > a > img')
owner_names = soup.select('#floatRightBox > div.js_box.clearfix > div.w_240 > h6 > a')
sexes = soup.select('#floatRightBox > div.js_box.clearfix > div.member_pic > div')
for title, address, price, pic1, owner_name, owner_pic, sex in zip(titles, addresses, prices, pics1, owner_names,
owner_pics, sexes):
data = {
'title': title.get_text(),
'address': address.get_text(),
'price': price.get_text(),
'pic': pic1.get('src'),
'owner_pic': owner_pic.get('src'),
'name': owner_name.get('title'),
'sex': get_sex(sex.get('class'))
}
print (data)
urls = ["http://bj.xiaozhu.com/search-duanzufang-p{}-0/".format(number) for number in range(1, 10)]
for url in urls:
get_page_url(url)
成果
{'name': '想要', 'address': '北京市朝陽區望京利澤西園\n ', 'price': '395', 'owner_pic': 'http://image.xiaozhustatic1.com/21/5,0,44,1477,329,329,ea609ac8.jpg', 'title': '望京華彩十四號線精美豪華大一居', 'sex': '未標識', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/6,0,39,2965,1800,1200,f17d1a3e.jpg'}
{'name': '暖陽洋Sunny', 'address': '北京市朝陽區彩虹路\n ', 'price': '798', 'owner_pic': 'http://image.xiaozhustatic1.com/21/2,0,86,206,375,375,d46c51ef.jpg', 'title': '緊鄰798、望京、酒仙橋,精品大三居。', 'sex': '未標識', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/3,0,34,2819,1800,1200,e051c333.jpg'}
{'name': '小小西紅柿', 'address': '北京市豐臺區六里橋太平橋西里40號\n ', 'price': '368', 'owner_pic': 'http://image.xiaozhustatic1.com/21/6,0,72,1777,260,260,887558a2.jpg', 'title': '臨近 北京西站 距電力醫院3分鐘 兩居', 'sex': '女', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/6,0,28,4451,1800,1200,e3bb1749.jpg'}
{'name': '想要', 'address': '北京市朝陽區廣順北大街利澤西園\n ', 'price': '395', 'owner_pic': 'http://image.xiaozhustatic1.com/21/5,0,44,1477,329,329,ea609ac8.jpg', 'title': '望京商圈,毗鄰地鐵5分鐘,漫威主題大兩居', 'sex': '未標識', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/6,0,66,803,1800,1200,38a4c686.jpg'}
{'name': '最美好的時光遇到你', 'address': '北京市朝陽區小關北里\n ', 'price': '218', 'owner_pic': 'http://image.xiaozhustatic1.com/21/4,0,84,10730,260,260,6d756363.jpg', 'title': '惠新西街南口陽光大主臥', 'sex': '女', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/5,0,47,2122,1800,1200,8830e613.jpg'}
{'name': '暖陽洋Sunny', 'address': '北京市朝陽區彩虹路\n ', 'price': '268', 'owner_pic': 'http://image.xiaozhustatic1.com/21/2,0,86,206,375,375,d46c51ef.jpg', 'title': '獨立衛浴鄰798、望京、酒仙橋更多優惠房源。', 'sex': '未標識', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/2,0,71,458,1800,1200,a9c5ea82.jpg'}
{'name': '陽光豔豔', 'address': '北京市朝陽區蘋果社區北區\n ', 'price': '398', 'owner_pic': 'http://image.xiaozhustatic1.com/21/5,0,59,2841,363,363,8b6cf3d7.jpg', 'title': '國貿雙井10號線蘋果酒店式公寓', 'sex': '女', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/6,0,25,3184,1800,1200,4b993d38.jpg'}
{'name': '蘭花姐', 'address': '北京市朝陽區十里河左安東路弘善家園\n ', 'price': '279', 'owner_pic': 'http://image.xiaozhustatic1.com/21/4,0,2,9806,329,329,4656b7f6.jpg', 'title': '潘家園十里河地鐵十號十四號臨近國貿', 'sex': '女', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/6,0,83,2043,1800,1200,cc659348.jpg'}
{'name': 'Alicejy', 'address': '北京市朝陽區望京南湖中園\n ', 'price': '195', 'owner_pic': 'http://image.xiaozhustatic1.com/21/6,0,3,3065,160,160,ba886bf8.jpg', 'title': '望京親水微豪庭,獨享奢華對望東湖灣', 'sex': '女', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/6,0,62,3156,1800,1200,7d5aa8bc.jpg'}
{'name': '小肖肖', 'address': '北京市東城區南鑼鼓巷\n ', 'price': '158', 'owner_pic': 'http://image.xiaozhustatic1.com/21/5,0,55,1517,260,260,ea96ce11.jpg', 'title': '南鑼鼓巷0距離,鼓樓、後海、故宮、簋街', 'sex': '女', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/1,0,53,2309,825,550,5a3a9a34.jpg'}
{'name': '豹子楠', 'address': '北京市西城區高粱橋斜街長河灣\n ', 'price': '398', 'owner_pic': 'http://image.xiaozhustatic1.com/21/1,0,8,5386,333,333,764cfdb4.jpg', 'title': '西直門 長河灣 韓式田園溫馨2居', 'sex': '女', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/1,0,3,5482,825,550,f874984d.jpg'}
{'name': '幸福姐姐', 'address': '北京市朝陽區紅軍營南路\n ', 'price': '128', 'owner_pic': 'http://image.xiaozhustatic1.com/21/1,0,93,4699,375,375,f8bc8f9b.jpg', 'title': '北五環5.13號地鐵高檔的溫馨公寓', 'sex': '女', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/1,0,42,4845,825,550,57c0343f.jpg'}
{'name': 'Rolling_meng', 'address': '北京市朝陽區勁松華騰園\n ', 'price': '318', 'owner_pic': 'http://image.xiaozhustatic1.com/21/5,0,96,1555,375,375,ea000c2a.jpg', 'title': '10號線勁松/雙井/國貿CBD採光舒適大一居', 'sex': '男', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/6,0,40,333,1800,1200,c8e516a7.jpg'}
{'name': '啵妞的家', 'address': '北京市朝陽區十里堡潤楓嘉尚\n ', 'price': '338', 'owner_pic': 'http://image.xiaozhustatic1.com/21/1,0,33,4216,366,366,c589a192.jpg', 'title': '6號線地鐵公寓', 'sex': '女', 'pic': 'http://image.xiaozhustatic1.com/00,800,533/6,0,60,2088,1800,1200,3b057da1.jpg'}
好了,今天的知識就分享到這裡,歡迎關注愛編程的南風,私信關鍵詞:學習資料,獲取更多學習資源,如果文章對你有有幫助,請收藏關注,在今後與你分享更多學習python的文章。同時歡迎在下面評論區留言如何學習python。
閱讀更多 愛編程的南風 的文章