1.什么是互联网爬虫
如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小 蜘蛛,沿着蜘蛛网抓取自己想要的数据
解释 1 :通过一个程序,根据 Url ( http : // www . taobao . com ) 进行爬取网页,获取有用信息解释 2 :使用程序模拟浏览器,去向服务器发送请求,获取响应信息
2.爬虫核心
1. 爬取网页:爬取整个网页 包含了网页中所有得内容2. 解析数据:将网页中你得到的数据 进行解析3. 难点:爬虫和反爬虫之间的博弈
3.爬虫的用途
- 数据分析/人工数据集
- 社交软件冷启动
- 舆情监控
- 竞争对手监控
4.爬虫分类
通用爬虫:
实例 百度、360、google、sougou等搜索引擎‐‐‐伯乐在线
功能 访问网页 ‐> 抓取数据 ‐> 数据存储 ‐> 数据处理 ‐> 提供检索服务robots 协议一个约定俗成的协议,添加 robots . txt 文件,来说明本网站哪些内容不可以被抓取,起不到限制作用自己写的爬虫无需遵守网站排名 ( SEO )1. 根据 pagerank 算法值进行排名(参考个网站流量、点击率等指标)2. 百度竞价排名缺点1. 抓取的数据大多是无用的2. 不能根据用户的需求来精准获取数据
聚焦爬虫功能根据需求,实现爬虫程序,抓取需要的数据设计思路1. 确定要爬取的 url如何获取 Url2. 模拟浏览器通过 http 协议访问 url ,获取服务器返回的 html 代码如何访问3. 解析 html 字符串(根据一定规则提取需要的数据)如何解析
5.反爬手段
1. User ‐ Agent :User Agent中文名为用户代理,简称 UA ,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版 User Agent 中文名为用户代理,简称 UA ,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。2. 代理 IP西次代理快代理什么是高匿名、匿名和透明代理?它们有什么区别?1. 使用透明代理,对方服务器可以知道你使用了代理,并且也知道你的真实 IP 。2. 使用匿名代理,对方服务器可以知道你使用了代理,但不知道你的真实 IP 。3. 使用高匿名代理,对方服务器不知道你使用了代理,更不知道你的真实 IP 。3. 验证码访问打码平台云打码平台超级🦅4. 动态加载网页 网站返回的是 js 数据 并不是网页的真实数据selenium驱动真实的浏览器发送请求5. 数据加密分析 js 代码
6.urllib 库的使用
urllib . request . urlopen () 模拟浏览器向服务器发送请求response 服务器返回的数据response的数据类型是 HttpResponse字节 ‐‐> 字符串解码decode字符串 ‐‐> 字节编码encoderead () 字节形式读取二进制 扩展: rede ( 5 ) 返回前几个字节readline () 读取一行readlines () 一行一行读取 直至结束getcode () 获取状态码geturl () 获取 urlgetheaders () 获取 headersurllib . request . urlretrieve ()请求网页请求图片请求视频
7.请求对象的定制
UA 介绍: User Agent 中文名为用户代理,简称 UA ,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统 及版本、CPU 类型、浏览器及版本。浏览器内核、浏览器渲染引擎、浏览器语言、浏览器插件等
语法:request = urllib.request.Request()
8.编解码
1.get 请求方式:urllib.parse.quote()
import urllib.request
import ssl
import urllib.parse
#通过导入ssl模块把证书验证改成不用验证就行了。
ssl._create_default_https_context = ssl._create_unverified_context
url = 'https://www.baidu.com/s?wd='
headers={
'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
#将詹姆斯变成unicode编码格式 依赖于urllib.parse
name = urllib.parse.quote('詹姆斯')
#print(name)
url = url+name
#print(url)
#请求对象定制
request = urllib.request.Request(url=url,headers=headers)
#模拟浏览器向服务器发送请求
response=urllib.request.urlopen(request)
#获取响应内容
content=response.read().decode('utf-8')
#打印内容
print(content)
2.get请求方式:urllib.parse.urlencode()
import urllib.request
import urllib.parse
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
base_url = 'https://www.baidu.com/s?'
data = {
'wd' : '詹姆斯',
'sex' : '男'
}
headers={
'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
new_url = urllib.parse.urlencode(data)
url = base_url + new_url
headers={
'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
#请求对象定制
request = urllib.request.Request(url=url,headers=headers)
#模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)
#获取网页源码数据
content = response.read().decode('utf-8')
print(content)
3.post请求
import urllib.request
import urllib.parse
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
url = 'https://fanyi.baidu.com/sug'
headers = {
'user‐agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
}
keyword = input('请输入您要查询的单词')
data = {
'kw':keyword
}
data = urllib.parse.urlencode(data).encode('utf‐8')
request = urllib.request.Request(url=url,headers=headers,data=data)
response = urllib.request.urlopen(request)
print(response.read().decode('utf‐8'))
4.get 和 post 区别
1 : get 请求方式的参数必须编码,参数是拼接到 url 后面,编码之后不需要调用 encode 方法2 : post 请求方式的参数必须编码,参数是放在请求对象定制的方法中,编码之后需要调用 encode 方法
5.小案例 百度详细翻译
import urllib.request
import urllib.parse
import ssl
import json
ssl._create_default_https_context = ssl._create_unverified_context
url = 'https://fanyi.baidu.com/v2transapi?from=en&to=zh'
headers = {
'Accept' : '*/*',
#'Accept-Encoding' : 'gzip, deflate, br',
'Accept-Language' : 'zh-CN,zh;q=0.9',
'Connection' : 'keep-alive',
'Content-Length' : '136',
'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie':'88FC5EB492CFC5B3DEDB97EF524CC056; PSTM=1625455688; BAIDUID=88FC5EB492CFC5B3094372450577A441:FG=1; __yjs_duid=1_7f4083786b10d2693da503a13f93a0fa1625456003607; BDUSS=kl0enRDU1VlYlh4bVBHdmpQYi02UnVBVUdsRUttZlBUaFVkOFNJQU9hNGRMMHhoRVFBQUFBJCQAAAAAAAAAAAEAAAAGik00Y2hlbjY1NDMyMTIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2iJGEdoiRha; BDUSS_BFESS=kl0enRDU1VlYlh4bVBHdmpQYi02UnVBVUdsRUttZlBUaFVkOFNJQU9hNGRMMHhoRVFBQUFBJCQAAAAAAAAAAAEAAAAGik00Y2hlbjY1NDMyMTIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2iJGEdoiRha; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; H_PS_PSSID=34648_34531_34068_31254_34551_33848_34585_34504_26350_34627_34419_34556_34688_34671; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BAIDUID_BFESS=88FC5EB492CFC5B3094372450577A441:FG=1; BCLID=9237247964798861170; BDSFRCVID=QPIOJexroG0YyvRHsi7Rfd7YY_weG7bTDYLEOwXPsp3LGJLVJeC6EG0Pts1-dEu-EHtdogKK0mOTHUkF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF=tR3aQ5rtKRTffjrnhPF3-R83XP6-hnjy3bRkX4Q4Wp7DhDTIb5JZWq4Wbttf5q3RymJ42-39LPO2hpRjyxv4y4Ldj4oxJpOJ-bCL0p5aHl51fbbvbURvD-ug3-7PaM5dtjTO2bc_5KnlfMQ_bf--QfbQ0hOhqP-jBRIEoCvt-5rDHJTg5DTjhPrMhHAJWMT-MTryKKJwM4ncOh7PDq6tb5-4WJnfKx-fKHnRhlR2B-3iV-OxDUvnyxAZyxomtfQxtNRJQKDE5p5hKq5S5-OobUPUDMc9LUvP22cdot5yBbc8eIna5hjkbfJBQttjQn3hfIkj2CKLtCvDqTrP-trf5DCShUFs-TjCB2Q-XPoO3KJZJtQ-yMnDDq8EbaJkXlRf5mkf3fbgylRp8P3y0bb2DUA1y4vpBtQmJeTxoUJ2-KDVeh5Gqfo15-0ebPRiJPr9QgbPBhQ7tt5W8ncFbT7l5hKpbt-q0x-jLTnhVn0MBCK0hDvPKITD-tFO5eT22-us2mFJ2hcHMPoosIJX2JjCyM4VXtchKTbkyGOf0l05KfbUoqRHXnJi0btQDPvxBf7pWDTm_q5TtUJMqIDzbMohqfLn5MOyKMnitIj9-pnG2hQrh459XP68bTkA5bjZKxtq3mkjbPbDfn028DKuDjRDKICV-frb-C62aKDsafjxBhcqJ-ovQT3Z2Jkgyhb0thjh5nvkhx755l0bHxbeWfvMXn-R0hbjJM7xWeJpaJ5nJq5nhMJmKTLVbML0qto7-P3y523ion6vQpnljpQ3DRoWXPIqbN7P-p5Z5mAqKl0MLPbtbb0xXj_0DjPVKgTa54cbb4o2WbCQLxJz8pcN2b5oQT842qjNBnJ0Jarh0I3wyx7beq06-lOUWfAkXpJvQnJjt2JxaqRCWJ5TMl5jDh3MKToDb-otexQ7bIny0hvctn6cShnaMUjrDRLbXU6BK5vPbNcZ0l8K3l02V-bIe-t2XjQh-p52f6DDJRA83f; BCLID_BFESS=9237247964798861170; BDSFRCVID_BFESS=QPIOJexroG0YyvRHsi7Rfd7YY_weG7bTDYLEOwXPsp3LGJLVJeC6EG0Pts1-dEu-EHtdogKK0mOTHUkF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF_BFESS=tR3aQ5rtKRTffjrnhPF3-R83XP6-hnjy3bRkX4Q4Wp7DhDTIb5JZWq4Wbttf5q3RymJ42-39LPO2hpRjyxv4y4Ldj4oxJpOJ-bCL0p5aHl51fbbvbURvD-ug3-7PaM5dtjTO2bc_5KnlfMQ_bf--QfbQ0hOhqP-jBRIEoCvt-5rDHJTg5DTjhPrMhHAJWMT-MTryKKJwM4ncOh7PDq6tb5-4WJnfKx-fKHnRhlR2B-3iV-OxDUvnyxAZyxomtfQxtNRJQKDE5p5hKq5S5-OobUPUDMc9LUvP22cdot5yBbc8eIna5hjkbfJBQttjQn3hfIkj2CKLtCvDqTrP-trf5DCShUFs-TjCB2Q-XPoO3KJZJtQ-yMnDDq8EbaJkXlRf5mkf3fbgylRp8P3y0bb2DUA1y4vpBtQmJeTxoUJ2-KDVeh5Gqfo15-0ebPRiJPr9QgbPBhQ7tt5W8ncFbT7l5hKpbt-q0x-jLTnhVn0MBCK0hDvPKITD-tFO5eT22-us2mFJ2hcHMPoosIJX2JjCyM4VXtchKTbkyGOf0l05KfbUoqRHXnJi0btQDPvxBf7pWDTm_q5TtUJMqIDzbMohqfLn5MOyKMnitIj9-pnG2hQrh459XP68bTkA5bjZKxtq3mkjbPbDfn028DKuDjRDKICV-frb-C62aKDsafjxBhcqJ-ovQT3Z2Jkgyhb0thjh5nvkhx755l0bHxbeWfvMXn-R0hbjJM7xWeJpaJ5nJq5nhMJmKTLVbML0qto7-P3y523ion6vQpnljpQ3DRoWXPIqbN7P-p5Z5mAqKl0MLPbtbb0xXj_0DjPVKgTa54cbb4o2WbCQLxJz8pcN2b5oQT842qjNBnJ0Jarh0I3wyx7beq06-lOUWfAkXpJvQnJjt2JxaqRCWJ5TMl5jDh3MKToDb-otexQ7bIny0hvctn6cShnaMUjrDRLbXU6BK5vPbNcZ0l8K3l02V-bIe-t2XjQh-p52f6DDJRA83f; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1631869573,1632280940; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1632281197; __yjs_st=2_NmYxMDYxOWE1YjRhMTczYWIyYTg5NWI3YWY1YmYyOGU1MzgzNGM2NmEyZGRlNGNiYTFhOGI1ODI5ZjA2YzM3MDk2ZjQ0ZmZhMzQxMDA2ODRmNDlkMDE1NjFjZWI1ZGIzZjJmZDM4MjU3MmEzMzM1YzM2MWI4MDA2MWU1ZWU1MTcwZTk3YThmNzIwNTZlYTg5YmU5OWMyZWVjMTgxZTEwYTIwMjMzNmM2YjY0ZmIxZTEyOThhNDJhODJmZDVhMjRmMDc4YjZlMjNjYzJjOGYyMTFlOTY1YjdjMDJiZGRkODQ2Y2ViYjIxZTUzY2FhYjkwN2EwZWU1YWExZWQ1ZjVlZV83XzUxMWQ3ZDQ5; ab_sr=1.0.1_NjhhNTA5YTJiYjcyMmZkNzU0NzExZWZiNzkxMWY0YTE2ZDUzYjkzNjk1YTY4NDEzZDg5ZTVmNGNiNjA4YTk2ZDQ1MDQ0OTBmY2ZjZDI5OTVkMjA4ODA3YjZkMGY2NzYxODE0ODNhMzQ2NjkxYzVlMDU1NzBkY2I4ZWFjNGY5OGJjODQ1OTlhNWQ0N2NmNDFiYmI0ZGYxNTgwMWNmYzdjODRiOWVjY2JhMzgzMTgyMDg4NjNiMjgzMDllMTMxNWIz',
'Host': 'fanyi.baidu.com',
'Origin': 'https://fanyi.baidu.com',
'Referer': 'https://fanyi.baidu.com/?aldtype=16047',
'sec-ch-ua': '"Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"',
'sec-ch-ua-mobile': '?0',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
}
data = {
'from' : 'en',
'to' : 'zh',
'query' : 'james',
'transtype' : 'realtime',
'simple_means_flag': '3',
'sign': '350819.112978',
'token': 'e32acf88174e5591d2e57863d1d204fd',
'domain' : 'common',
}
data = urllib.parse.urlencode(data).encode('utf-8')
request = urllib.request.Request(url=url,data=data,headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
new_content = json.loads(content)
print(new_content)