我的第一个爬虫

这里首先说下python的第三方库,python之所以强大并渐渐流行起来,一部分的原因要归功于python强大的第三方库。作业用户就不用了解底层的原理,用最少的代码写更多的功能。

爬虫的三大常用库

Requests库,BeautifualSoup库和Lxml库

安装方法:

这里说下用pip命令安装,pip install name(需要安装库的名称)

例如:pip install BeautifualSoup4,     pip install Requests


Requests库

Requests库的作用就是请求网站获取网页数据的。让我们从简单的实例开始讲解Requests库的使用方法。

import requests

#获取百度页面的html

res = requests.get("http://www.baidu.com")

#pycharm中返回的结果为<Response[200]>,说明请求网址成功,如果状态码为404,400则表示请求网址失败。

print "状态:",res

print res.text

#pycharm部分结果如下



BeautifulSoup库

BeautifulSoup库是一个非常流行的Python模块,我们通过BeautifulSoup库可以轻松的解析Requests库请求的网页,并把网页源代码解析为Soup文档,以便过滤提取数据。

import requests

from bs4 import BeautifulSoup

#请求头

headers = {

            "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"

}

res = request.get("http://www.baidu.com",headers)

#html.parser是用来解析HTML的,也可以用lxml来解析
soup = BeautifulSoup(res.text,"html.parser")

#prettify()格式化输出
print soup.prettify()

结果如下


Lxml库

lxml库是基于libxm12这一个XML解析库的Python封装。该模块使用C语言编写,解析速度比BeautifulSoup更快,具体使用以后再说


示例(一),爬取地区租房信息

(1)爬取小猪短租北京地区的短租房13页的信息,通过浏览,对比前三页的网址:

bj.xiaozhu.com/

bj.xiaozhu.com/search-duanzufang-p2-0/

http://bj.xiaozhu.com/search-duanzufang-p3-0/

发现只需要更改P后面的数字即可跳转到相应的页面

(2)本次爬虫在详细页中进行,所有需要爬取进入到详细页的网址链接,进而爬取数据。

(3)需要爬取的信息有:标题,地址,价格,房东名称,房东头像链接,具体如下图所示


具体的代码如下

# -*- encoding:utf8 -*-
import requests
from bs4 import BeautifulSoup
import itertools
import time
# 请求头,用来模拟浏览器
# 1.类选择器class:“.class”
# 2. id 选择器:“#id”
# 3.派生选择器:“p strong”
# 4.属性选择器:“[title] / [title=te]”
headers = {
    "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
}

# 性别的判断,性别为女的标签类名为member_ico1
def judgment_sex(class_name):
    if class_name == ["member_ico1"]:
        return "女"
    else:
        return "男"

# 定义获取详细url(每页的房源url)的函数
def get_links(url):
    wb_data = requests.get(url,headers=headers)
    soup = BeautifulSoup(wb_data.text,"lxml")
    # 获取id为page_list下的ul,ul下的li,li下面的a标签,返回的是一个a标签数组
    links = soup.select("#page_list > ul > li > a")
    for link in links:
        # 获取a标签里面的href属性
        href = link.get("href")
        time.sleep(2)
        # 依次调用get_info函数,把获取的链接传入进去
        get_info(href)

#获取网页具体信息的函数
def get_info(url):
    wb_data = requests.get(url,headers=headers)
    soup = BeautifulSoup(wb_data.text,"lxml")
    # 获取标题,标题在class=pho_info的一个div里面
    titles = soup.select("div.pho_info > h4")
    # 获取地址
    addressses = soup.select("span.pr5")
    # 获取价格
    prices = soup.select("#pricePart > div.day_l > span")
    # 获取房东图片链接
    imgs = soup.select('#floatRightBox > div.js_box.clearfix > div.member_pic > a > img')
    # 获取房东姓名
    names = soup.select('#floatRightBox > div.js_box.clearfix > div.w_240 > h6 > a')
    # 获取房东性别
    sexs = soup.select('#floatRightBox > div.js_box.clearfix > div.member_pic > div')
    # itertools.izip()可以平行迭代多个数组
    for title,address,price,img,name,sex in itertools.izip(titles,addressses,prices,imgs,names,sexs):
        data = {
            # Python strip() 方法用于移除字符串头尾指定的字符(默认为空格)。
            "title":title.text.strip(),
            "address":address.text.strip(),
            "price":price.text,
            "img":img.get("src"),
            "name":name.text,
            "sex":judgment_sex(sex.get("class"))
        }
        print data

# pyhton中程序的主入口
if __name__ == "__main__":
    # 构建多页的url,后期可以用scrapy跟进爬取
    urls = ["http://bj.xiaozhu.com/search-duanzufang-p{}-0/".format(number) for number in range(1,14)]
    for begin in urls:
        # 循环调用get_links函数
        get_links(begin)
        # 睡眠4秒,防止访问频率过高无法访问
        time.sleep(4)

具体可以实现,但是这个网址有反爬虫,结果很尴尬多试了几次后就显示下面这样的情况,一开始解除限制后还可以继续爬取,但是多试了几次后就不能再爬了,等下次什么时候再可以访问的时候再去爬取,,,


操作的过程中有个有趣的事,就是如果你一边运行爬虫一边自己继续浏览网页,基本不会被封,就写到这里吧,后面再去细学如何防止爬虫被封杀


附:第二天我又试了下,又可以访问了,于是尝试一边爬一边浏览网页,结果和我猜测的一样,一边浏览网页一边爬取网页的话不会出现访问过于频繁,而且爬取了很多的数据,如下图


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值