网络爬虫基础笔记(1)

robots君子协议:
网站中哪些数据不可以被爬取

http协议:

常用请求头信息:
user-Agent:请求载体的身份标识
connection:请求完毕后,断开还是保持连接

常用响应头信息
connection-Type:服务器响应回客户端数据类型


https:
安全的超文本传输协议

加密方式:
对称密钥加密:
非对称密钥
证书密钥



requests模块:
urllib模块
requests模块

requests模块:
python中原生的基于网络请求的模块,功能强大,简单便捷,效率极高
作用:模拟浏览器发请求。

如何使用:
1.指定url
2.发起请求
3.获取响应数据
4.持久化存储

安装环境
pip install requests

爬取搜狗首页数据
import requests

if __name__ == '__main__':

    url = 'https://www.sogou.com/'   指定url

    # requests.get(url)

    response = requests.get(url=url)     发送请求,get 方法会得到一个响应对象

    page_text = response.text    获得响应数据,text方法返回字符形式的响应数据

    print(page_text)


    持久化存储
    with open('./sogou.html', 'w', encoding='utf-8') as fp:
        fp.write(page_text)

    print('爬取结束')


案例:网页采集器
UA伪装:让爬虫对应的身份载体伪装为某一浏览器
import requests

url = 'https://sogou.com/web'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.12151 SLBChan/103'
}

kw = input('请输入一个词')

param = {
    'query': kw
}

res = requests.get(url=url, params=param, headers=headers)

page_text = res.text

filename = kw+'.html'

with open('E:/爬虫/'+filename, 'w', encoding='utf-8') as fp:
    fp.write(page_text)

print('完成')


破解百度翻译

post 返回json

import requests
import json

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

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.12151 SLBChan/103'
}

kw = input('请输入一个单词')

data = {
    'kw': kw
}

res = requests.post(url=post_url, data=data, headers=headers)

dic_obj = res.json()

filename = f'E:/爬虫/{kw}的意思.json'

fp = open(filename, 'w', encoding='utf-8')
json.dump(dic_obj, fp=fp, ensure_ascii=False)

print('over')


re模块:

正则表达式:

元字符
. 匹配除换行之外的所有字符  在re模块中需要注意
\w 匹配所有的字母跟数字跟下划线
\s 匹配任意空白符
\d 匹配任意数字
\n 匹配一个换行符
\t 匹配一个制表符

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

\W 匹配非字母数字下划线
\D 匹配非数字
\S 匹配非空白字符
a|b 匹配字符a或字符b
() 匹配括号内的表达式,也表示一个组
[...] 匹配字符组中的字符
[^...] 匹配除了字符组中的字符

量词:
* 重复0次或更多次
+ 重复1次或更多次
? 重复0次或更多次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复

贪婪匹配与惰性匹配
贪婪匹配: .*
惰性匹配: .*?

re模块:
import re

# res = re.findall(r'\d+', '你好,我是200002,我今年18岁')
# 前面写的是正则表达式,后面是要匹配的字符串

# res = re.finditer(r'\d+', '你好,我是200002,我今年18岁')
# for item in res:
#     print(item.group())
# 返回的是迭代器,效率更高,使用频繁

# res = re.search(r'\d+', '我叫周杰伦,我32岁,3年纪2半')
# print(res.group())
# search会匹配到第一次匹配的内容

res = re.match(r'\d+', '我叫周杰伦,我32岁,3年纪2半')
print(res)
# match在匹配的时候默认在前面加上了^
# 相当于^\d+

# print(res)

想要提取数据必须拿小括号括起来,也可以单独起名字
(?P<名字>正则)
提取数据的时候,需要group('名字')


bs4:

from bs4 import BeautifulSoup   导入元素(第三方库)

html = """
<ul>
    <li><a href="zhangwuji.com">张无忌</a></li>
    <li id="abc"><a href="zhouxingchi.com">周星驰</a></li>
    <li><a href="zhubajie.com">猪八戒</a></li>
    <li><a href="wuzetian.com">武则天</a></li>
</ul>
"""

page = BeautifulSoup(html, 'html.parser')    表示解析的是html

page.find('li', attrs={'属性': '值'})   查找某个元素,只会找到一个结果
a = li1.find('a')  也可以继续find
print(a.text)   拿文本用text
print(a.get('href'))   拿属性用get('属性')



find_all(参数一样)   是找到所有结果


pyquery笔记

from pyquery import PyQuery

html = """
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<ul>
    <li class="aaa"><a href="www.baidu.com">百度</a></li>
    <li class="bbb"><a href="www.google.com">谷歌</a></li>
    <li class="ccc"><a href="www.qq.com">腾讯</a></li>
    <li id="ddd"><a href="www.hhh.com">哈哈哈</a></li>
</ul>

</body>
</html>
"""

p = PyQuery(html)   把html加载进pyquery

# a = p('li.aaa a').text()       拿到标签中的文本
# a2 = p('#ddd a').attr('href')  #是id选择器,attr拿到a标签中的属性
# print(a)
# print(a2)

# 坑
# href = p('li a').attr('href')   只能打印第一个
# print(href)


# 解决
# hrefs = p('li a').items()     用迭代器进行循环
# for item in hrefs:
#     href = item.attr('href')
#     text = item.text()
#     print(text, href)

# 对于html结构的修改
p('li.aaa').after('<li class="aaa">哈哈哈</li>')     after 是在标签后新增
p('li.bbb').append('<span>我爱你</span>')          append是在标签内新增
p('li.ccc').attr('class', 'eee')          attr属性修改
p('li.eee').attr('id', '12345')        新增id属性,前提是该标签没有这个属性
p('li.ddd').remove_attr('class')      移除属性

remove是删除标签

print(p)


代理格式

proxy = {
    'http': 'http://118.190.244.234:3128',
    'https': 'https://118.190.244.234:3128',
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值