网络爬虫学习心得1

这段时间看了唐松老师写的《python网络爬虫从入门到实践》,学到许多网络爬虫方面的知识,也以书里的实践项目进行练手。
我的第一篇的网络爬虫心得,就以书里第五章的实践:爬虫实践:房屋价格数据,参考书里的内容进行练手。

实践项目是获取安居客网站上北京二手房的数据。本项目需要获取前10页二手房源的名称、价格、几房几厅、大小、建造年份、联系人、地址、标签。网页地址为:http://beijing.anjuke.com/sale/。
这里我把北京改为了泉州丰泽区。

第一步,网站分析。
和书里介绍的内容一样,网站一页有60个二手房信息,翻页有明显的规则,对于翻页,我写了一个获得页面地址的列表。

link = []
for i in range(1,11):
    link.append('https://quanzhou.anjuke.com/sale/fengzequ/p'+str(i)+'/#filtersort')

二手房信息的结构,是以每一套房进行展开,包含了房源的名称、价格、几房几厅、大小、建造年份、联系人、地址等相关内容。这些内容对应的标签为:
每一套房源的标签: li class=“list-item over-bg” data-from=""
房源的名称:div class=“house-title” 下的a标签
几房几厅: div class="details-item"下的span
面积大小:div class="details-item"的contents[3]
层高:div class="details-item"的contents[5]
建站年份:div class="details-item"的contents[7]
价格:span,class=“price-det”
单价:span,class=“unit-price”
地址:span,class=“comm-address”

有了这些内容对应的标签,就可以利用BeautifulSoup库的find来找到对应的内容。

第二步,爬虫代码编写
首先,导入requests和BeautifulSoup库

import requests
from bs4 import BeautifulSoup

接着,定制请求头,利用for循环生成每个页面的链接

header = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
link = []
for i in range(1,11):
    link.append('https://quanzhou.anjuke.com/sale/fengzequ/p'+str(i)+'/#filtersort')

定制requests请求头,利用network找到Hearders。
在定制requests请求头要注意,user-agent后的内容直接从网页拷贝出来会有一个空格,需要去掉,不然会出错。

接下来,爬取房源的数据

要爬取10页的房源数据,需要做一个循环

for n in range(10):
    r = requests.get(link[n],headers=header,timeout=10)
    soup = BeautifulSoup(r.text,'lxml')  

取每一页的60个房源数据

h_list = soup.find_all('li',class_='list-item')
for house in h_list:
    name = house.find('div',class_='house-title').a.text.strip()
    room = house.find('div',class_='details-item').span.text.strip()
    area = house.find('div',class_='details-item').contents[3].text.strip()
    hight = house.find('div',class_='details-item').contents[5].text.strip()
    price = house.find('span',class_='price-det').text.strip()
    pp = house.find('span',class_='unit-price').text.strip()
    address = house.find('span',class_='comm-address').text.strip()
    output = '\t'.join([name,room,area,hight,price,pp,address])
       
    with open(r'd:\house.txt','a+',encoding='utf-8') as f:
        f.write(output)

这里要注意的是,文件写入是用gbk码写入,爬取数据的有些符号会导致出错,比如空格、平方。需要修改写文件用utf-8格式。

最后放上完整的代码

import requests
from bs4 import BeautifulSoup


header = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
link = []
for i in range(1,11):
    link.append('https://quanzhou.anjuke.com/sale/fengzequ/p'+str(i)+'/#filtersort')


for n in range(10):
    r = requests.get(link[n],headers=header,timeout=10)
    soup = BeautifulSoup(r.text,'lxml')    
     
    h_list = soup.find_all('li',class_='list-item')
    for house in h_list:
        name = house.find('div',class_='house-title').a.text.strip()
        room = house.find('div',class_='details-item').span.text.strip()
        area = house.find('div',class_='details-item').contents[3].text.strip()
        hight = house.find('div',class_='details-item').contents[5].text.strip()
        price = house.find('span',class_='price-det').text.strip()
        pp = house.find('span',class_='unit-price').text.strip()
        address = house.find('span',class_='comm-address').text.strip()
        output = '\t'.join([name,room,area,hight,price,pp,address])
       
        with open(r'd:\house.txt','a+',encoding='utf-8') as f:
            f.write(output)

通过这个练手实践,基本上能掌握静态页面的爬取。

你可能感兴趣的:(网络爬虫学习心得1)