第一次写博客,有问题还请各位小主谅解。文章主要针对初学爬虫,重在提供程序设计思路。从文章结构按照设计步骤顺序进行,相同的标题则表示不同方法下的代码。后面文章会附有具体的示例
# 爬虫教程总结
# =============================================================================
# 主要程序设计步骤:
# 1、导入第三方库
# 2、获取目标网页
# 3、解析目标网页,提取所需元素
# 4 下载目标元素
# =============================================================================
# =============================================================================
# 注意事项:
# 1、编译器配置第三方库,主要有requests,lxml,beautifulsoup等
# 2、ctrl+shift+i获取源代码,点击左上角指针今天可以快速定位
# 3、注意一些反爬命令:User-Agent,则需要加入请求头headers模拟浏览器
# 4、主要提取过程汉字的编码格式,encoding='utf-8'
# 5、学会解析网页的父子节点
# 6、了解保存文件的方法with open(,)as f:f.write(,'\n' )
# =============================================================================
# 源代码
#1.导入第三方库
import re #3.1.1导入第三方解析库
#1.1基础第三方库requests,用于获取网页源代码,返回到response
import requests
from lxml import etree #3.1.1导入第三方解析库
from bs4 import BeautifulSoup #3.1.1导入第三方解析库
#2.获取网页源代码
#2.1 定义获取网页源代码url的函数get_url()
def get_url():
url='http://·······'
#2.2 定义一个r用于接受requests.get()所返回的response,网址下所有的网页源代码
r=requests.get(url) #'='不是复制,相当于指针
#2.3 由于网页源代码采用的ASCII码编译,因此只能编码英文字符,具有很大的局限性,
# 而Unicode 为每种语言中的每个字符设定了统一并且唯一的二进制编码,
# 以满足跨语言、跨平台进行文本转换、处理的要求所以需要转换字体编码格式
# encoding是编码的意思,在python中,Unicode类型是作为编码的基础类型。
r.encoding = 'UTF-8'
#2.4以文本形式打印r所指向的所有网页源代码
print(r.text)
#3.解析网页源代码,提取目标元素
#3.1 解析网页需要用到第三方库,常用的有lxml,beautifulsoup,re(正则表达式*)
# 3.1.1 使用lxml;则需要导入 lxml库中的etree模块;from lxml import ertee
# 3.1.1 使用beautifulsoup;from bs4 import BeautifulSoup
# 3.1.1 使用正则表达式re;import re
#······ ························lxml···········································
#3.1.2 解析url,提取元素
# 用etree模块初始化html,html指向r.text里的所有网页网代码
html=etree.HTML(r.text)
# Xpath一个元素选择器
imgs = html.xpath('//div[@class="table-pic"]/img/@src')
#names = html.xpath('//div[@class="table-pic"]/div/text')
# 网页源代码通过标签进行指向,class为所对应标签的属性,通过属性定位到所需
# 提取的元素,'//div[@class="table-pic"]/img/@src'首先定位到属性为
# class="table-pic"的标签div,再找到该标签下的img标签,img标签下只有一个
# 图片的网页链接src,通过@src提取src所指向的图片链接;(如果是子节点标签下
# 是文本,则'//div[@class="table-pic"]/div/text()')
print(imgs)
savefile(imgs) #4.1调用保存函数
#·······························lxml···········································
#···························BeautifulSoup·····································
#3.1.2 解析url,提取元素
# find_all搜索当前标签的所有子节点标签,并判断是否符合过滤器的条件。
all_img = BeautifulSoup(r.text, 'lxml').find_all('img', class_='_2zEKz')
# 获取网页中的class为_2Mc8_的所有div标签中间的子代,截取了所有符合条件的img
# 标签下的所有内容,需要进一步筛选提取img标下的不同元素
for img in all_img:
img_url=img['src']
print(img_url) #循环获取所有符合条件的img标签中的scr所指向的内容
savefile(img_url) #4.1调用保存函数
#···························BeautifulSoup······································
#······························re··············································
#3.1.2 解析url,提取元素
# 正则表达式:re.findall;在字符串中找到正则表达式所匹配的所有子串,
# 并返回一个列表,如果没有找到匹配的,则返回空列表。
html = r.text
title_list = re.findall('href=".*?".<strong>(.*?)</strong>',html)
# 即匹配 href=所包含的strong标签中的指向的最少字符,、
# 可以查看网页源代码查看标签strong中的内容
print(title_list)
savefile(title_list) #4.1调用保存函数
#正则表达式:
# r'(.*) are (.*?) .*'
# 首先,这是一个字符串,前面的一个 r 表示字符串为非转义的原始字符串,
# 让编译器忽略反斜杠,也就是忽略转义字符。但是这个字符串里没有反斜杠,
# 所以这个 r 可有可无。
# (.*) 第一个匹配分组,.* 代表匹配除换行符之外的所有字符。
# (.*?) 第二个匹配分组,.*? 后面多个问号,代表非贪婪模式,也就是说只匹配符合
# 条件的最少字符
# 后面的一个 .* 没有括号包围所以不是分组匹配效果和第一个一样但是不计入匹配结果中。
#······························re··············································
# =============================================================================
# #3.2对上述解析提取的元素进行处理
# for name in names:
# d=nam.strip() #去掉空格个换行
# print(d)
# =============================================================================
#4.下载目标元素
#4.1定义保存函数,并且调用函数
def savefile(data):
# =============================================================================
# #4.2 请求目标元素的下载地址(一般只有图片需要,因为图片提取的是图片的网址,
# # 还需要再请求图片的地址)
# print('开始请求图片地址,过程会有点长...')
# img = requests.get(data)
# =============================================================================
#4.3 定义保存命名
# file_name =
#4.4创建文件夹并保存
f = open('F://python//test//爬虫学习//保存' + '/'+
file_name, 'ab')
print('开始保存图片')
f = open(file_name, 'ab')
f.write(img.content)
f.close()
#with open ('F://python//test//爬虫学习//保存'+'/'+
# file_name,'ab') as f:f.write(img.content+'\n')
get_url()
savefile()
欢迎留言,多多交流,互相学习