本来想爬取一些由js加载的数据(浏览人数),但是这个页面改版了,浏览人数直接呈现的。并且成色,发布日期两项都没有了,所以本次爬虫基本还是之前的套路。
结果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,
}
# 发帖时间,成色没有
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()
这个跟之前爬取的小猪短租别无二致,所以需要总结的不多,说说其中遇到的一些问题吧!
- 之前没有挂代理,所以58阻止了爬虫进行,于是加了代理headers
- 爬取的部分数据需要处理,用了strip()方法截取了字符前后的空格
- 又忘记了写入text文本的方法,牢记,这个查着不好查
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有些类的时候,在HTML中显示的比方说
ifo t
,中间有空格,但是写在path中就必须加'_'这个下划线,也就是用下划线代替空格 - 不在使用zig来做循环了,实际上,每次爬取页面就只有那么一个东西,所以就用
title[0].text
来保证,[0]是选取列表第一个元素(就只有一个元素),text就是get_text()的作用
总结:
1.先写出爬出一个详细页面的爬虫
2.在从预览页面爬取进入详细页面的跳转连接
3.添加预览页面的list,然后加入for循环,使得每个预览页面都爬取其所有的详细页面。
4.可以选择保存进text
5.爬取浏览量,假设是js加载的
比方这个是js加载的,我们就想办法生成这个申请地址,这个申请地址的区别就是里面的一串id,而这个id有存在在url中,所以我们可以获取url,然后截取id,再拼装成申请地址
代码:
1.从网页的url解析出来id
2.把id加进api申请网址中,
3.申请,得到返回
4.注意的问题是这里面可能还需要用到headers,具体碰到了注意一下
Paste_Image.png
以上
网友评论