一、内容介绍
本次爬虫实例为北京Q房网,涉及知识点有:
1、多层页面提取
2、图片下载
二、运行环境 + 运行结果
1、运行环境: win10 + Python 3.7.4 + pycharm-community-2019.2.2
2、运行结果:
三、源码
'''
导入reques库和lxml库,数据存储使用到CSV,所以
也要导入CSV模块,防止服务器反爬虫禁止要控制速度,
因此导入time模块
'''
from lxml import etree
import requests
import csv
import time
# 定义头部代理(user agent),伪装成浏览器
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/77.0.3865.90 Safari/537.36'}
# 这里user-agent信息过长,通过 \ 来换行拼接
# 主要的爬虫函数,在房源列表页面中解析出房源详情页的URL,然后打开这个URL,
# 提取房源年限和房源编号
def spider(list_url):
selector = download(list_url) # 下载列表页
house_list = selector.xpath('/html/body/div[4]/div/div[1]/div[4]/ul/li')
# 解析得到房源列表
# print(house_list)
# 循环解析每套房源的信息
for house in house_list:
title = house.xpath('div[2]/div[1]/a/@title')[0]
name = house.xpath('div[2]/div[3]/div/a[3]/text()')[0]
price = house.xpath('div[3]/p[1]/span[1]/text()')[0]
area = house.xpath('div[2]/div[2]/p[2]/text()')[0]
# 构造URL,下载图片
image_url = house.xpath('div[1]/a/img/@data-original')[0]
img = requests.get(image_url, headers=headers)
house_url = ('http://beijing.qfang.com'
+ house.xpath('div[2]/div[1]/a/@href')[0])
sel = download(house_url)
# 下载详情页,解析获取信息
# print(house_url)
# //*[@id="scrollto-1"]/div[2]/ul/li[2]/div/ul/li[4]/div
time.sleep(1)
house_years = sel.xpath('//*[@id="scrollto-1"]/div[2]'
'/ul/li[2]/div/ul/li[4]/div/text()')[0]
house_num = sel.xpath('//*[@id="scrollto-1"]/div[2]/ul'
'/li[2]/div/ul/li[7]/div/div/p/text()')[0]
with open('./Qfang_image/{}.jpg'.format(name + house_num), 'wb') as f:
f.write(img.content)
# 图片保存命名规则,这里采用小区+房源编号来区分(没有Qfang_image文件时会提示错误)
item = [title, name, price, area, house_years, house_num]
print(item) # 显示保存的单条信息
data_writer(item)
# 下载函数,专门下载页面的函数
def download(url):
print(url)
html = requests.get(url, headers=headers)
time.sleep(2)
# print(html.text)
return etree.HTML(html.text)
# 保存函数,在解析到的数据保存
def data_writer(item):
with open('qfang_ershoufang.csv', 'a',
encoding='utf-8', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(item)
# 主函数,这里爬取两个页面
if __name__ == '__main__':
pre_url = 'https://beijing.qfang.com/sale/f'
for i in range(1, 3):
spider(pre_url + str(i))