
解释 1 :通过一个程序,根据 Url ( http : // www . taobao . com ) 进行爬取网页,获取有用信息 解释 2 :使用程序模拟浏览器,去向服务器发送请求,获取响应信息2.爬虫核心
1. 爬取网页:爬取整个网页 包含了网页中所有得内容 2. 解析数据:将网页中你得到的数据 进行解析 3. 难点:爬虫和反爬虫之间的博弈3.爬虫的用途
通用爬虫:
实例 百度、360、google、sougou等搜索引擎‐‐‐伯乐在线
功能 访问网页 ‐> 抓取数据 ‐> 数据存储 ‐> 数据处理 ‐> 提供检索服务 robots 协议 一个约定俗成的协议,添加 robots . txt 文件,来说明本网站哪些内容不可以被抓取,起不到限制作用自己写的爬虫无需遵守 网站排名 ( SEO ) 1. 根据 pagerank 算法值进行排名(参考个网站流量、点击率等指标) 2. 百度竞价排名 缺点 1. 抓取的数据大多是无用的 2. 不能根据用户的需求来精准获取数据
聚焦爬虫 功能 根据需求,实现爬虫程序,抓取需要的数据 设计思路 1. 确定要爬取的 url 如何获取 Url 2. 模拟浏览器通过 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 字符串 ‐‐> 字节 编码encode read () 字节形式读取二进制 扩展: rede ( 5 ) 返回前几个字节 readline () 读取一行 readlines () 一行一行读取 直至结束 getcode () 获取状态码 geturl () 获取 url getheaders () 获取 headers urllib . 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)