本來(lái)想爬取一些由js加載的數(shù)據(jù)(瀏覽人數(shù)),但是這個(gè)頁(yè)面改版了,瀏覽人數(shù)直接呈現(xiàn)的。并且成色,發(fā)布日期兩項(xiàng)都沒(méi)有了,所以本次爬蟲(chóng)基本還是之前的套路。

結(jié)果
from bs4 import BeautifulSoup
import requests
import json
import time
User_Agent = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'
headers = {
'User-Agent': User_Agent,
}
# 發(fā)帖時(shí)間,成色沒(méi)有
def request_details(url):
f = requests.get(url, headers=headers)
soup = BeautifulSoup(f.text, 'lxml')
category = soup.select('div.breadCrumb.f12 > span:nth-of-type(4)')
title = soup.select('h1.info_titile')
price = soup.select('span.price_now > i')
area = soup.select('div.palce_li > span > i')
view_num = soup.select('span.look_time')
data = {
'title': title[0].text,
'category': category[0].text.strip(),
'price': price[0].text,
'area': area[0].text,
'view_num': view_num[0].text
}
return data
def get_link(url):
f = requests.get(url)
soup = BeautifulSoup(f.text, 'lxml')
links = soup.select('zzinfo > td.img > a')
link_list = []
for link in links:
link_content = link.get('href')
link_list.append(link_content)
return link_list
def save_to_text(content):
content = json.dumps(content, ensure_ascii=False)
with open('58', 'a', encoding='utf-8') as f:
f.write(content)
f.write('\r\n')
def main():
link = 'http://bj.58.com/pbdn/0/pn{}'
start = 1
end = 10
urls = [link.format(i) for i in range(start, end)]
for url in urls:
link_list = get_link(url)
for link in link_list:
content = request_details(link)
time.sleep(1)
print(content)
save_to_text(content)
if __name__ == '__main__':
main()
這個(gè)跟之前爬取的小豬短租別無(wú)二致,所以需要總結(jié)的不多,說(shuō)說(shuō)其中遇到的一些問(wèn)題吧!
- 之前沒(méi)有掛代理,所以58阻止了爬蟲(chóng)進(jìn)行,于是加了代理headers
- 爬取的部分?jǐn)?shù)據(jù)需要處理,用了strip()方法截取了字符前后的空格
- 又忘記了寫(xiě)入text文本的方法,牢記,這個(gè)查著不好查
def save_to_text(content):
content = json.dumps(content, ensure_ascii=False)
with open('58', 'a', encoding='utf-8') as f:
f.write(content)
- 在select有些類(lèi)的時(shí)候,在HTML中顯示的比方說(shuō)
ifo t,中間有空格,但是寫(xiě)在path中就必須加'_'這個(gè)下劃線,也就是用下劃線代替空格 - 不在使用zig來(lái)做循環(huán)了,實(shí)際上,每次爬取頁(yè)面就只有那么一個(gè)東西,所以就用
title[0].text來(lái)保證,[0]是選取列表第一個(gè)元素(就只有一個(gè)元素),text就是get_text()的作用
總結(jié):
1.先寫(xiě)出爬出一個(gè)詳細(xì)頁(yè)面的爬蟲(chóng)
2.在從預(yù)覽頁(yè)面爬取進(jìn)入詳細(xì)頁(yè)面的跳轉(zhuǎn)連接
3.添加預(yù)覽頁(yè)面的list,然后加入for循環(huán),使得每個(gè)預(yù)覽頁(yè)面都爬取其所有的詳細(xì)頁(yè)面。
4.可以選擇保存進(jìn)text
5.爬取瀏覽量,假設(shè)是js加載的
比方這個(gè)是js加載的,我們就想辦法生成這個(gè)申請(qǐng)地址,這個(gè)申請(qǐng)地址的區(qū)別就是里面的一串id,而這個(gè)id有存在在url中,所以我們可以獲取url,然后截取id,再拼裝成申請(qǐng)地址
代碼:
1.從網(wǎng)頁(yè)的url解析出來(lái)id
2.把id加進(jìn)api申請(qǐng)網(wǎng)址中,
3.申請(qǐng),得到返回
4.注意的問(wèn)題是這里面可能還需要用到headers,具體碰到了注意一下
Paste_Image.png
以上

