爬虫基础(案例:爬取链家网,附:BeautifulSoup中常用的一些操作)
程序员文章站
2022-06-05 19:00:11
...
soup.find("ul")
返回首个标签为ul的标签内容。类型为soup,仍然可以使用soup类函数对返回内容进行处理。
soup.find("ul",attrs = {"class":"ul2"})
返回标签为ul,且属性class = ul2的标签内容。即添加attrs进行过滤,返回满足要求的首个标签。
print(soup.findAll("ul",attrs = {"class":"content"}))
soup.findAll 默认返回所有内容,类型是list,list中的每个元素都是一个soup类。可添加attrs进行过滤。
爬取思路:
1、链家二手房信息是静态数据,在HTML源码中可以找到。
2、要实现的功能有:提供搜索功能,搜索地区返回二手房信息,若多个页面则提供翻页功能,最后将信息保存起来。
3、分析网页的url得到模板url = “https://zz.lianjia.com/ershoufang/pg{}rs{}/” ,pg表示页号,rs表示搜索的关键字,需要手动输入。输入的时候要使用quote进行编码然后拼接到url上
4、得到url就可以进行爬取了。
import requests
import json
import csv
from urllib.parse import quote
from bs4 import BeautifulSoup
headers = {
"User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}
def get_house(url):
res = requests.get(url,headers = headers)
soup = BeautifulSoup(res.text,"html.parser")
# 问:如果怎么知道find到的内容一定包含需要的信息呢?
soup_ul = soup.find("ul",attrs = {"class":"sellListContent"}).find_all("li")
cnt = 0
for i in soup_ul:
print(i.find("div",attrs = {"class":"title"}).text)
print(i.find("div",attrs = {"class":"positionInfo"}).text.replace(" ",""))
print(i.find("div",attrs = {"class":"houseInfo"}).text.replace(" ",""))
print(i.find("div",attrs = {"class":"totalPrice totalPrice2"}).text.replace(" ",""))
print(i.find("div",attrs = {"class":"unitPrice"}).text.replace(" ",""))
break
def get_num(url):
res = requests.get(url,headers = headers)
soup = BeautifulSoup(res.text,"html.parser")
soup_div = soup.find("div",attrs = {"class":"page-box house-lst-page-box"})
if(soup_div == None):
return 0
return json.loads(soup_div.attrs["page-data"])["totalPage"]
def main():
url = "https://zz.lianjia.com/ershoufang/pg{}rs{}/"
wd = input("请输入查询地区:")
url1 = url.format(1,quote(wd))
r = get_num(url1)
for i in range(1,r+1):
url1 = url.format(i,quote(wd))
get_house(url1)
main()