浅谈Python爬虫
参考文章:传送门
Python 爬虫架构主要由五个部分组成,分别是调度器、URL管理器、网页下载器、网页解析器、应用程序(爬取的有价值数据)。
- 调度器:相当于一台电脑的CPU,主要负责调度URL管理器、下载器、解析器之间的协调工作。
- URL管理器:包括待爬取的URL地址和已爬取的URL地址,防止重复抓取URL和循环抓取URL,实现URL管理器主要用三种方式,通过内存、数据库、缓存数据库来实现。
- 网页下载器:通过传入一个URL地址来下载网页,将网页转换成一个字符串,网页下载器有urllib2(Python官方基础模块)包括需要登录、代理、和cookie,requests(第三方包)
- 网页解析器:将一个网页字符串进行解析,可以按照我们的要求来提取出我们有用的信息,也可以根据DOM树的解析方式来解析。网页解析器有正则表达式(直观,将网页转成字符串通过模糊匹配的方式来提取有价值的信息,当文档比较复杂的时候,该方法提取数据的时候就会非常的困难)、html.parser(Python自带的)、beautifulsoup(第三方插件,可以使用Python自带的html.parser进行解析,也可以使用lxml进行解析,相对于其他几种来说要强大一些)、lxml(第三方插件,可以解析 xml 和 HTML),html.parser 和 beautifulsoup 以及 lxml 都是以 DOM 树的方式进行解析的。
- 应用程序:就是从网页中提取的有用数据组成的一个应用。
Python爬虫爬取某一页面中所有的链接
参考文章:传送门
import requests
from bs4 import BeautifulSoup
resp=requests.get('https://www.zero0.top') #请求百度首页
print(resp) #打印请求结果的状态码
print(resp.content) #打印请求到的网页源码
bsobj=BeautifulSoup(resp.content,'lxml') #将网页源码构造成BeautifulSoup对象,方便操作
a_list=bsobj.find_all('a') #获取网页中的所有a标签对象
text='' # 创建一个空字符串
for a in a_list:
href=a.get('href') #获取a标签对象的href属性,即这个对象指向的链接地址
text+=href+'\n' #加入到字符串中,并换行
with open('url1.txt','w') as f: #在当前路径下,以写的方式打开一个名为'url.txt',如果不存在则创建
f.write(text) #将text里的数据写入到文本中
Requests库:通过http协议发送请求,并处理返回的数据。
BeautifulSoup库:HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。
Python爬虫按页爬取某一网站中的图片
参考文章:传送门
import os
import re
import requests
from bs4 import BeautifulSoup
def getHtml(url): # 固定格式,获取html内容
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/78.0.3904.108 Safari/537.36 '
} # 模拟用户操作
try:
r = requests.get(url, headers=headers)
r.raise_for_status() # 判断返回值是否为200,如果不是200,他就会产生一个HttpError的异常
r.encoding = r.apparent_encoding # 指定r.encoding的编码格式;通过r.apparent_encoding属性来指定,直接将其值赋给r.encoding
return r.text
except:
print('网络状态错误')
def getUrlList(url): # 获取图片链接
url_list = [] # 存储每张图片的url,用于后续内容爬取
demo = getHtml(url)
soup = BeautifulSoup(demo, 'html.parser')
sp = soup.find_all('div',
class_="list") # class='list'在全文唯一,因此作为锚,获取唯一的div标签;注意,这里的网页源代码是class,但是python为了和class
# (类)做区分,在最后面添加了_
nls = re.findall(r'a href="(.*?)"', str(sp)) # 用正则表达式提取链接
for i in nls:
if 'https' in i: # 因所有无效链接中均含有'https'字符串,因此直接剔除无效链接(对应第3条的分析)
continue
if 'pic' in i:
continue
url_list.append('http://www.netbian.com/' + i) # 在获取的链接中添加前缀,形成完整的有效链接
return url_list
print(url_list)
def fillPic(url, page): # 保存图片
pic_url = getUrlList(url) # 调用函数,获取当前页的所有图片详情页链接
path = './图片' # 保存路径
for p in range(len(pic_url)):
pic = getHtml(pic_url[p])
soup = BeautifulSoup(pic, 'html.parser')
psoup = soup.find('div', class_="pic")
picUrl = re.findall(r'src="(.*?)"', str(psoup))[0]
pic = requests.get(picUrl).content
image_name = '图片' + '第{}页'.format(page) + str(p + 1) + '.jpg'
image_path = path + '/' + image_name
with open(image_path, 'wb') as f:
f.write(pic)
print(image_name, '下载完毕!!!')
def main():
n = input('请输入要爬取的页数:')
url = 'http://www.netbian.com/dongman/'
if not os.path.exists('./图片'):
os.mkdir('./图片/')
page = 1
fillPic(url, page)
if int(n) >= 2:
ls = list(range(2, 1 + int(n)))
url = 'http://www.netbian.com/dongman/'
for i in ls:
page = str(i)
url_page = 'http://www.netbian.com/dongman/'
url_page += 'index_' + page + '.htm'
fillPic(url_page, page)
main()
OS库:与操作系统相关的标准库。如:文件,目录,执行系统命令等。
RE库:主要用于字符串的匹配。
Comments | NOTHING