python几行代码就能写个简单的爬虫

python几行代码就能写个简单的爬虫

python最让人觉得方便的就是能够使用各种的库。不同于java、c、c++等语言,这些库是很多成熟统一的方法。这使得初入python的小白也能凭借一点点的代码知识优雅的使用这些库。
https://www.bilibili.com/video/BV1EV411d7jg
对于爬虫来说,最简单爬虫只需要几步就能够实现。

requests库

如果你随便找了一个python的安装包安装在电脑上了,那么你肯定能够找到运行python的最基本的shell程序。(windows 和 linux 都有)

在基本的python包中,python已经自带了一个网络访问包,就是urllib和(或)urllib2。不再细讲它,它也具有访问链接并返回网页内容的一系列函数。不过不常用,我也没有仔细了解为啥。

requests库是常用的一个url函数库,集合了相关的方法,并且也十分方便简洁。我下面会使用这个库,经过三步爬取一个网站的相关图片。

爬取

首先,导入必须的库。(如果报错记得安装这个库,命令行使用install ****进行安装)

import requests

接下来进行访问,

// 存一个你想访问的网站的链接 例如
url = 'http://www.ratoo.net/a/retu/'
// 使用代理字段进行地址伪装,至于怎么找这个东西,可以专门看看爬虫地址伪装的资料或视频
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'}
//使用requests函数get方法访问该网页
page_data = requests.get(url=url,headers=headers)

page_data中已经存储了一次访问后返回的数据,一般来说,网页中的图片和文字信息已经存在了上面,我们所要做的就是将它存储下来即可。

好了,最简单的爬虫已经做完了,没想到吧,它实际只有两行代码,定义url与调用方法访问对应的urlheaders伪装实际上是防止服务器检测到爬虫访问做的备用手段。

如果你使用了比较高级的编译器,例如pycharm等,你应该能够看到page_data的属性和内容,这个集合里包含了网页的所有信息,至于想要的具体内容,就需要每个人根据具体需求对这一团数据进行处理了。

例如我举例的图片,我们可以在数据中寻找该段数据,保存为对应图片名称就行了。实际就工作量来说,爬虫的访问往往不是最大的,工作量最大的是爬虫爬取的数据处理。

数据查找与存储

对于数据处理我们可以使用三种方法:正则表达式、bs4、xpath;
本文只讲一下使用bs4处理数据的方法。
首先还是库。

// An highlighted block
import os
from bs4 import BeautifulSoup

这个库提供了简单的查找方式:find方法和find_all方法
我们先查看一下网页的标签属性
网页标签
对于爬取的数据一般使用find查找对应标签:

//使用bs4的解析器对爬取的数据进行解析,它把数据分割在了不同的标签中。
soup = BeautifulSoup(page_data,'html.parser')
//查找想要的标签 find 函数返回第一个div标签内容,find_all返回全部div内容
div = soup.find('div')
//find_all方法
divs = soup.find_all('div')

我们一般需求是查找上面所示的标签中的class对应内容以及包含的href内容。通过class能够定位到目的内容名字,通过href能够访问到内容数据,通过标签能够指导访问的是什么内容。

// 寻找所有的a标签,并提出内容为‘下一条’的链接,保存该链接内容。
as = soup.find_all('a')
for a in as:
	if a.string=='下一条' //查找到a标签携带的字符串信息为 ‘下一条’
		break
url=url+a[herf][0] //提取标签的herf尾缀,与主url链接拼接就能访问对应数据
pic_data=requests.get(url,headers).content

现在该链接的图片数据已经有了,写入图片保存就行了。

// 以'写入''二进制'格式打开对应链接名称的图片,写入数据
with open(a.string+'.img','wb') as fp
fp.write(pic_data)

除了bs4库,re库(正则表达式),xpath也是常见的处理数据的库,对于熟悉java、php、js等语言的同学应该对正则表达式处理字符串不陌生。
下面给一段使用正则表达式处理数据并且目前可以正常运行的代码。注意了,这个普通的爬虫只适用于静态网站,对于一些动态网站则需要其他的方式进行访问,例如动态参数提取和采用selenium挂件的方式。后面想写了再分享吧。

import requests
import re
import os
#创建文件夹
if not os.path.exists('./setuLibs'):
    os.mkdir('./setuLibs')

#创建新方法爬取热图图片
url = 'http://www.ratoo.net/a/retu/'
#伪装地址
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'}

page_data = requests.get(url=url,headers=headers)
page_data.encoding = 'gb2312'
page_data = page_data.text
#使用正则进行处理 一个存地址 一个存名称
ex = '<a class="listimg" href=\'.*?<img src=\'(.*?)\'.*?</div>'
exname = '<a class="listimg".*?title="(.*?)" target=.*?</div>'
ex_type = '<a class="listimg".*?\.(...)\' border=\'0\'>.*?</div>'
image_src_list = re.findall(ex,page_data,re.S)
image_name = re.findall(exname,page_data,re.S)
image_type = re.findall(ex_type,page_data,re.S)

print(image_src_list)
#拼接完整地址
count = 0
for src in image_src_list:
    src = 'http:' + src

    #可以完整获取图片content数据,进行二进制写入文件并保存
    print(src)
    url = src
    ima_data = requests.get(url=url,headers=headers).content

    with open(u'./setuLibs/' + image_name[count] + '.' + image_type[count],'wb') as fp:
        fp.write(ima_data)
        print(image_name[count],'下载成功')

    count=count+1


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值