Python爬虫(持续更新)

Python爬虫(持续更新),第1张

Python爬虫(持续更新) Python爬虫(持续更新)

robots.txt 协议 君子协定

eg1:
from urllib.request import urlopen

url = "http://www.baidu.com"
urlopen(url)
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骨架,第二次请求拿到数据,进行数据展示

​ 在页面源代码中看不到数据

熟练使用浏览器抓包工具

2.Http协议

超文本协议 Hyper Text Transfer Protocol

请求:

请求行 -> 请求方式(get/post) 请求url地址 协议
请求头 -> 放一些服务器要使用的附加信息

请求体 -> 一般放一些请求参数

响应:

状态行 -> 协议 状态码等200 404 302
响应头 -> 放一些客户端要使用的一些附加信息

响应体 -> 服务器返回的真正客户端要用的内容(HTML,json等)

请求头中爬虫需要:

1.user-agent:请求载体的身份标识

2.Referer:防盗链(这次请求是从哪个页面来的?反爬会用到)

3.cookie:本地字符串数据信息(用户登录信息,反爬的token)

响应头中的一些重要内容:

1.cookie:本地字符串数据信息(用户登录信息,反爬的token)

2.各种字符(需要经验)

请求方式:GET POST

3.Requests入门

安装:pip install requests 清华大学国内源

#eg1: GET请求
import requests
query = input ("输入一个你喜欢的明星")
url = f'https://www.sogou.com/web?query={query}'  #f的用法
dic ={
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
}

resp = requests.get(url,headers = dic)
print(resp.text)
#eg2:针对POST请求
import requests  #POST

url='https://fanyi.baidu.com/sug'

s = input("Please input your word")
dat ={
    "kw":s

}
resp = requests.post(url,data = dat)
print(resp.json)
#eg3:
import requests

url ='https://movie.douban.com/j/chart/top_list'
#重新封装参数
param = {
    "type": "25",
    "interval_id": "100:90",
    "action": "",
    "start": "0",
    "limit": "20",
}
headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
}
resp = requests.get(url = url ,params=param,headers= headers)
print(resp.json())
resp.close()  #关掉resp
4.数据解析

1.re解析 Regular expression

2.bs4解析

3.xpath解析

这三种方式可以混合进行使用,完全以结果做导向,之后再考虑性能

正则表达式

正则的语法:使用元字符进行排列组合用来匹配字符串。

测试:https://tool.oschina.net/regex/ 开源中国提供

元字符:具有固定含义的特殊符号

常用元字符: 每个元字符默认匹配一位字符串

 . 匹配除换⾏符以外的任意字符
w 匹配字⺟或数字或下划线
s 匹配任意的空⽩符
d 匹配数字
n 匹配⼀个换⾏符
t 匹配⼀个制表符

^ 匹配字符串的开始
$ 匹配字符串的结尾

W 匹配⾮字⺟或数字或下划线  大写为反义
D 匹配⾮数字
S 匹配⾮空⽩符
a|b 匹配字符a或字符b
()  匹配括号内的表达式,也表示⼀个组
[...]  匹配字符组中的字符     eg:[a-zA-Z0-9_] 
[^...] 匹配除了字符组中字符的所有字符

量词:控制前面的元字符出现的次数

*		重复零次或更多次
+		重复一次或更多次
?		重复零次或一次
{n}		重复n次
{n,}	重复n次或更多次
{n,m}	重复n到m次

贪婪匹配和惰性匹配 爬虫常用

.*	贪婪匹配	选择长的一项
.*?	惰性匹配    选择短的一项   (回溯算法)
5.re模块
import re

#匹配字符串中所有的符合正则的内容
list = re.findall(r"d+","我的电话号是:10086")
print(list)

#finditer :匹配字符串中所有的内容(返回的是迭代器),从迭代器中拿到的内容需要.group()
it = re.finditer(r"d+","我的电话号是:10086")
for i in it:
    print(i.group())

# search,找到一个结果就返回,返回的结果是match对象,拿数据需要.group()
s = re.search(r"d+","我的电话号是:10086,我女朋友的电话是:10010")

#match是从头开始匹配

#预加载正则表达式 compile() 方便后面的使用
obj = re.compile(r"d+")
ret = obj.finditer("我的电话号是:10086,我女朋友的电话是:10010")
for it in ret:
    print(it.group())
ret = obj.findall("呵呵哒,我就不信你不换我1000000000000")
print(ret)
import re

s = """
 艾林艾德勒  
 福尔摩斯 
 莫里亚蒂  
 麦克罗夫特  
"""
# re.S: 让.能匹配换行符       (?P<分组名字>正则) 可以单独从正则匹配的内容中进一步提取内容
obj = re.compile(r"d+)'>(?P.*?)",re.S)

result = obj.finditer(s)
for it in result:
    print(it.group("name"))
    print(it.group("id"))

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5690003.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-17
下一篇2022-12-17

发表评论

登录后才能评论

评论列表(0条)

    保存