#第5篇分享:python爬虫-开启数据收集新时代(1)

#python爬虫的初体验
1.爬虫介绍:
a.理论基础: 爬虫就是从网站中获得我们需要的数据,包括文字,音频,视频等;但是不是所有网站都可以轻易爬取的,因为有些数据主人是不希望被共享的,所以就出现了反爬,学习初期可以找一些不带反爬的网站练习,后期一点点增加难度,攻防博弈,其乐无穷。

爬虫分为:
通用爬虫, 比如搜索引擎:百度、谷歌、火狐;
聚焦爬虫, 针对性的去爬取某个网页,比如轻音乐网,预告片网等等,抓取对应的数据(我们主要介绍的就是聚焦爬虫);

爬虫三部曲:数据爬取->数据清洗->数据存储(使用及管理)

b.爬虫模块介绍:
#1.不需安装,直接用python自带爬虫模块进行学习:from urllib import request;
#2.安装第三方模块requests:pip install requests;import requests;

以上选择一个使用即可,语法不同,功能一致。

c.数据清洗模块介绍:
#1.不需要安装,直接用python自带模块进行学习:import re(正则表达式数据筛选,不需要在意要筛选数据的格式,下面是总结的正则表达式用法);
#2.安装lxml:针对.html网页信息的筛选、清洗,F12可以查看网页源代码:pip install lxml;from lxml import etree;

注:
#1. 正则表达式re:
a.任何文字数字符号均有相对应的匹配格式;
b.匹配过程有两种模式,贪婪模式(.)及非贪婪模式(.?);
c. reserch()匹配一次结束,findall()匹配到全部内容结束;
#2.html文档匹配lxml,以div标签为例:
a.//div(表示匹配这个标签下面所有内容)
b.//div[@class=“属性”](表示div标签且含有这个属性的标签下面的内容)
c.//div[@class=“属性”]/a(表示具有这个属性标签下面的a标签内容)/text()爬取出的内容会去除标签
d.//div[@class=“属性”]/a/@href (表示匹配a标签下面href的值)

以上可以混合使用,选择合适的清洗方法代码会更简洁。

可能看了上面的介绍不太明白,不慌,本人也是学了很久才顿悟了,本来就是初体验,先体会个思路就行,跟着我往下走,一起顿悟吧。

re:任意数据格式的筛选

# #正则表达式:数据筛选&匹配
import re
通字符作为原子(匹配一个普通字符)
# a="湖南湖北广东广西"
# pat="湖北"
# result=re.search(pat,a)
# print(result)

#匹配通用字符
#\w 任意字母/数字/下划线
#\W 和小写w相反
#\d 十进制数字
#\D 除了十进制数以外的值
#\s 空白字符
#\S 非空白字符

# b="136892763900"
# pat2="1\d\d\d\d\d\d\d\d\d\d"
# print(re.search(pat2,b))

# c="@@@@@@@@@@##@!_tdyuhdihdiw"
# pat3=r"\W\w\w"
# print(re.search(pat3,c))

#匹配数字、英文、中文
# 数字 [0-9]
# 英文 [a-z][A-Z]
# 中文 [\u4e00-\u9fa5]

# d="!@#$@#@##$张三%$^%$%#@$boy#@%##$%$$@#@#23@#@#@#@##$%$%$"

# pat1=r"[\u4e00-\u9fa5][\u4e00-\u9fa5]"
# pat2=r"[a-z][a-z][a-z]"
# pat3=r"[0-9][0-9]"

# result1=re.search(pat1,d)
# result2=re.search(pat2,d)
# result3=re.search(pat3,d)

# print(result1,result2,result3)

#原子表
#定义一组平等的原子
# b="18689276390"
# pat2="1[3578]\d\d\d\d\d\d\d\d\d"
# print(re.search(pat2,b))

# c="nsiwsoiwpythonjsoksosj"
# pat3=r"py[abcdt]hon"

# print(re.search(pat2,b))
很重要的
#元字符--正则表达式中具有特殊含义的字符
# . 匹配任意字符 \n除外
# ^ 匹配字符串开始位置  ^136
# $ 匹配字符串中结束的位置 6666$
# * 重复0次1次多次前面的原子 \d*
# ? 重复一次或者0次前面的原子 \d?              .*贪婪模式   .*?非贪婪模式
# + 重复一次或多次前面的原子  \d+

d="135738484941519874888813774748687"
# pat1="..."
# pat2="^135\d\d\d\d\d\d\d\d"
# pat3=".*8687$"
pat4="8*"
pat5="8+"
print(re.findall(pat5,d))

#匹配固定次数
#{n}前面的原子出现了n次
#{n,}至少出现n次
#{n,m}出现次数介于n-m之间
# a="234ded65de45667888991jisw"
# pat1=r"\d{8,10}"
# print(re.search(pat1,a))

# #多个表达式 |
# a="13699998888"
# b="027-1234567"
# pat1=r"1[3578]\d{9}|\d{3}-\d{7}"
# print(re.search(pat1,a))

#分组 ()
# a="jiwdjeodjo@$#python%$$^^&*&^%$java#@!!!!!!!!!!!!!!13688889999!!!!!!!!!!!!!!!!!#@#$#$"
# pat=r"(python).{0,}(java).{0,}(1[3578]\d{9})"
# print(re.search(pat,a).group(3))
#group() 同group(0)就是匹配正则表达式整体结果
#group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。

# a="jiwdjeodjo@$#python%$$^^&*&^%$java#@!!!!!!!!!!!!!!aaa我要自学网bbb!!!!!!!!!!!!!!!!!#@#$#$"
# pat=r"aaa(.*?)bbb"
# print(re.findall(pat,a))

**#贪婪模式和非贪婪模式**
#贪婪模式:在整个表达式匹配成功的前提下,尽可能多的匹配;
#非贪婪模式:在整个表达式匹配成功的前提下,尽可能少的匹配 ( ? );
#Python里默认是贪婪的。
# strr='aa<div>test1</div>bb<div>test2</div>cc'
# pat1=r"<div>.*</div>"
# print(re.search(pat1,strr)) #贪婪模式
# strr='aa<div>test1</div>bb<div>test2</div>cc'
# pat1=r"<div>.*?</div>"
# print(re.findall(pat1,strr)) #非贪婪模式

# import re
# #compile函数---将正则表达式转换成内部格式,提高执行效率
# strr="PYTHON666Java"
# pat=re.compile(r"Python",re.I) #模式修正符:忽略大小写
# print(pat.search(strr))

# import re
# #match函数和search函数
# # match函数--匹配开头
# # search函数--匹配任意位置
# #这两个函数都是一次匹配,匹配到一次就不再往后继续匹配了
# strr="javapythonjavahtmlpythonjs"
# pat=re.compile(r"python")
# print(pat.search(strr).group())

很重要的
# import re
# #findall()   查找所有匹配的内容,装到列表中
# #finditer()  查找所有匹配的内容,装到迭代器中
# strr="hello--------hello-----------\
# ---------hello-----------------\
# ---------hello--hello----------------\
# ----------hello---------hello----hello----------"
# pat=re.compile(r"hello")
# #print(pat.findall(strr))
# data=pat.finditer(strr)
# list1=[]
# for i in data:
#  list1.append(i.group())
# print(list1)

lxml:利用标签来筛选数据(进入网页->F12查看网页代码,找到需求数据->用标签筛选数据):扩展链接
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.第一个简易爬虫:
a.request+re爬虫:

from urllib import request                #python自带模块
import re                                 #正则表达式模块,用于数据筛选
import random                             #随机函数模块

# 1.网站地址:
url = "http://www.baidu.com/?tn=18029102_3_dg"
#2.浏览器选择
#伪装浏览器:多个浏览器随机选择
#a.创建自定义请求对象-----反爬虫机制
#b.反爬虫机制1:判断用户是否是浏览器访问
#c.可以通过伪装浏览器进行爬取访问
agent1 = "Mozilla/5.0 (Windows NT 10.0;Win64; x64) AppleWebKit/537.36 " \
         "(KHTML, like Gecko)Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362"
agent2 = "Mozilla/5.0 (Linux; Android 8.1.0; ALP-AL00Build/HUAWEIALP-AL00;" \
         " wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/63.0.3239.83 " \
         "Mobile Safari/537.36 T7/10.13 baiduboxapp/10.13.0.11 (Baidu; P1 8.1.0)"

#构造列表,随机选取浏览器
list = [agent1,agent2]
agent = random.choice(list)                       #随机数
header = {
    
    "User-Agent":agent}                     #构造请求头信息:字典格式
#print(agent)

#3.发送请求.获得响应信息
req = request.Request(url,headers = header)
reponse = request.urlopen(req).read().decode()  #解码----(编码encode)
#print(reponse)

#4.数据清洗
pat = r"<title>(.*?)</title>"   #通过正则表达式进行数据清洗
data = re.findall(pat,reponse)
#print(data)

#5.操作文件存储
f = open("wenjian.txt", "a+",encoding='utf-8')
f.write(data)
f.close()

b.requests-get方法爬虫:

import requests
url = "http://www.baidu.com/s?"
header = {
    
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0;\
           Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)\
           Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362"}
#get链接拼接
wd = {
    
    "wd","中国"}
#response = requests.request("get",url,params = wd,headers = header)
#获得get型的响应
response = requests.get(url,params = wd,headers = header)
#对响应进行编码
data1 = response.text    #返回字符串类型数据
data2 = response.content #返回二进制类型数据
data3 = data2.decode()   #返回字符串类型数据
#数据打印
print(data2)

c.requests-post方法爬虫:

import requests
import re

#构造请求头信息
header = {
    
    "User-Agent":"Mozilla / 5.0(WindowsNT10.0;Win64;x64) AppleWebKit /"
        "537.36(KHTML, likeGecko) Chrome / 70.0.3538.102Safari / 537.36Edge / 18.18362"}

url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
key = input("请输入想要翻译的内容:")
#post请求需要提交的参数
formdata={
    
    
"action":"FY_BY_CLICKBUTTION",
"bv":"1ca13a5465c2ab126e616ee8d6720cc3",
"client":"fanyideskweb",
"doctype":"json",
"from": "AUTO",
"i":key,
"keyfrom":"fanyi.web",
"salt":"15825444779453",
"sign":"28237f8c8331019bc43baef299570901",
"smartresult":"dict",
"to":"AUTO",
"ts":"1582544477945",
"version": "2.1"
}
response = requests.post(url,headers = header,data = formdata).text
pat = r'"tgt":"(.*?)"}]]'
result = re.findall(pat,response)
print(result)

d.requests+lxml方法爬虫:

#爬取糗事百科段子
from lxml import etree
import requests

url = 'https://www.qiushibaike.com/'
headers = {
    
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362'}

response = requests.get(url,headers=headers).content.decode()

html = etree.HTML(response)
result1 = html.xpath('//a[@crecmd-content]')
for i in range(len(result1)):
    print(result1[i].text)
    print("------------------------------------------")

怎么通过标签查找内容:
爬虫-数据查找
以上是我录制的视频,因为觉得有些知识,文字还是表达的不够丰满,有兴趣也可以看看我的其他视频 skr。

以上就是爬虫的初体验,上面的学过之后我相信我们已经对爬虫有了一个基本的认识,并且可以弄出一个基本的小爬虫,如果有兴趣可以继续和我往下学习,没有兴趣我给你推荐个网站,“全民解析”也算您没白来,想看免费VIP电影可以看看,本人购买了vip,但是继续付费提前解锁那种会用一下,一般人我都没告诉;
第五篇分享,持续更新中,,,,,

猜你喜欢

转载自blog.csdn.net/weixin_46008828/article/details/108645192
今日推荐