1、什么是爬虫:
网络爬虫,是一种自动抓取互联网信息的程序或者叫脚本,根据用户的需求定向的爬取数据。本质就是,打开网页获取想要的数据。
用到的几个模块
import bs4 #网页解析,进行获取数据 采用cmd打开控制面板,pip stall Beautifulsoup4
import re #正则表达式,进行文字匹配
import urllib.request,urllib.error #制定URL,获取网页数据
import xlwt #进行excel操作 pip stall xlwt
import sqlite3 #进行数据库操作
国内清华源下载镜像
手刃一个爬虫
from urllib.request import urlopen
url="http://www.baidu.com"
resp=urlopen(url)
with open("mybaidu.html",mode=''w'',encoding='utf-8') as f:#进行解码
f.write(resp.read.decode("utf-8"))
print("over")
1.web请求剖析
服务器渲染:把服务器那边直接与数据进行和HTML进行整和,统一返回浏览器
客服端渲染:第一次请求只要求一个html骨架,第二次请求,拿到数据,进行数据展示,在页面源代码中,找不到数据,找到请求=url,要求熟练掌握游览器抓包工具F12
2.HTTP/s协议
就是两个计算机为了沟通进行的一个君子协议,常见的协议有TOP/SOAP/HTTP/SMTP协议
HTTP协议进行超文本传输(就是进行页面源代码的传递)
请求
1.请求行->请求方式 (get/ post )url地址
2.请求头->放一些服务器的附加信息(防爬的内容)
3.请求体->放请求参数()
响应
1.状态行:状态码(200)(404)(500)
2.响应头:放一些客户的附加信息
3.响应体:返回客户真正需要的HTML,josn等
请求头中一些常见的内容:
User-Agent:请求载体身体身份标识:(用啥发送请求)
Referer:反盗链(一些反爬所需要)
cookie:本地字符串数据信息(用户登陆信息,反爬的的token)
响应头的一些内容:
1.cookie::本地字符串数据信息(用户登陆信息,反爬的的token)
2.各种神奇的字符串(各种攻击和反爬)
请求方式
get:查选,显示提交,所有地址栏的url
post:修改,隐私提交
get
import requests
a=input("请输入一个你喜欢的明星")url=f'https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&tn=monline_4_dg&wd=a={a}'
headers={"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0"
}
resp=requests.get(url,headers=headers)
print(resp)
print(resp.encoding)
resp.encoding='utf-8'#指定字符集
print(resp.encoding)
post
import requests
url="https://fanyi.baidu.com/sug"
s=input("请输入你要翻译的英文单词")
dat={
"KW":s
}#发送post请求
resp=requests.post(url,data=dat)#发送post请求,需要把数据放在字典中,通过data的参数进行传递
print(resp.text.)
客户端渲染
import requests
url="https://movie.douban.com/j/chart/top_list"
param={
"type":"24", #进行参数的包装
"interval_id":"100:90",
"action":"" ,
"start": "0",
"limit":" 20",
}
headers={"User-Agent":"Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.54"}#模拟游览器访问,
resp=requests.get(url=url,params=param,headers=headers)
print(resp.json())resp.close()#进行关闭response
正则表达式(RE解析)
(regular expression) OSchina在线工具
一种使用表达式的方式对字符串进行匹配的语法规则
元字符
全部内容点击链接
惰性匹配
.*?:但出现多个混淆时,问号则考虑了尽可能少的匹配内容
RE模块
import re
lst=re.findall(r"\d+","我的电话是1008611,我的女朋友的电话是5555")
print(lst)
#findall:匹配字符串中所有的符合正则的内容{返回列表}
#finditer:匹配字符串中所有的内容{返回为迭代器}
it=re.finditer(r"\d+","我的电话是1008611,我的女朋友的电话是5555")
print(it)#迭代器
for i in it:
print(i.group())#从在迭代器中拿到内容需要进行.group()#search返回的结果是match对象,拿数据需要.group()
import re
s=re.search(r"\d+","我的电话是1008611,我的女朋友的电话是5555")
print(s.group())
#特点全文预检索,检索一个则返回
#match 进行从头匹配
预加载正则表达式
#采用正则预加载
import re
obj=re.compile(r"\d+")
ret=obj.finditer("我的电话是1008611,我的女朋友的电话是5555")
for it in ret:
print(it.group())
豆瓣top250
from urllib.request import Request,urlopen
import re# 1.查找网页源代码
def get_page(url):
# 1.准备请求信息
r = Request(url=url,
headers={
'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1'})
# 2.打开url
response = urlopen(r)# 3.因为得到的文件用utf-8进行编码,所以用 utf - 8进行解码
return response.read().decode('utf-8')# 2.从网页中提取需要的信息
def get_infomation(s):
# 正则表达式
obj = re.compile(r'<div class="item">.*?<em class="">(?P<排名>.*?)</em>'
r'.*?<span class="title">(?P<电影名>.*?)</span>'
r'.*?导演: (?P<导演>.*?) '
r'.*?<span class="rating_num" property="v:average">(?P<评分>.*?)</span>'
, re.S)
# 运用正则表达式提取信息
result = obj.finditer(s)
lst = []
for item in result:
lst.append(item.groupdict())
# lst.append(item.group())
return lst
def main():
result = []
# 把所有的网页的信息都提取出来
for i in range(10):
s = get_page(f'https://movie.douban.com/top250?start={i * 25}')
result += get_infomation(s)
with open("test.txt", mode='a', encoding='utf-8') as fp:
for item in result:
fp.write(str(item))
fp.write('\n')
lst = []
# 去除字典的’ 和 { } 符号
with open("test.txt", mode='r', encoding='utf-8') as fp:
for line in fp:
k = line.replace('{', "")
k = k.replace("}", "")
k = k.replace("'", "")
lst.append(k)
with open("test.txt", mode='w', encoding='utf-8') as fp:
for item in lst:
fp.write(item)
main()
HTML语法
HTML超文本标记语言
<h1> i love you</h1>
<h2 align="center">i don't love you</h2>
#h1:是标签
#align:属性
#center:是属性值
<标签 属性=“属性值”>被标记的内容</标签>
<标签 />
<img src="xxx.jpg"/>这种标签自带闭合
下次更新,欢迎关注。