Python学习笔记之利用Requests和Lxml实现简单爬虫

 一、内容介绍

          本次爬虫实例为北京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))

 

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值