欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

爬虫基础(案例:爬取链家网,附: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 默认返回所有内容,类型是listlist中的每个元素都是一个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()