爬虫—流程总结
请求库:
一、requests
安装第三方库: requests;
导入第三方库:import requests
1.请求网络数据: requests.get(请求地址)
response = requests.get('https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js')
2.设置解码方式(乱码的是需要设置 - 一定要在获取请求结果之前设置)
response.encoding = 'utf-8'
# 编码方式和解码方式必须相同
3.获取请求结果
1)获取请求结果对应的文本数据 - 爬网页------>> response.text
2)获取二进制格式的请求结果 - 下载图片、视频、音频------>> response.content
3)获取请求结果json转换的结果 - json接口------>> response.json()
二、selenium
第三方库: selenium
导入使用: from selenium.webdriver import Chrome (谷歌浏览器)
获取标签对象: from selenium.webdriver.common.by import By
1.创建浏览器对象
b = Chrome()
2.打开网页(需要爬那个页面的数据,就打开那个页面对应的网页地址)
b.get('https://movie.douban.com/top250?start=0&filter=')
3.获取网页源代码(注意:不管以什么样的方式更新了界面内容,page_source的内容也会更新)
print(b.page_source) # 获取豆瓣电影top250的网页源代码
解析
解析库:bs4,lxml
bs4:
bs4(beautifulsoup4),它基于css选择器的网页解析器(css选择器: day2-csv和Bs4)
------>安装的时候装beautifulsoup4,使用的时候用bs4
安装库: beautifulsoup4
导入: from bs4 import BeautifulSoup
1.根据网页源代码创建soup对象: BeautifulSoup(网页源代码, ‘lxml’)
f = open('files/data.html', encoding='utf-8') # 打开files文件夹中的html文件data.html
soup = BeautifulSoup(f.read(), 'lxml') # 括号里面f.read()可以是任何html或xml数据
f.close()
2. 获取标签(css选择器直接获取网页标签)
soup对象.select(css选择器) - 获取整个网页中选择器选中的所有标签,返回值是一个列表,列表中的元素是标签对象(找不到返回空列表)
soup对象.select_one(css选择器) - 获取整个网页中选择器选中的第一个标签,返回值是标签对象(找不到返回None)
标签对象.select(css选择器) - 获取指定标签中css选择器选中的所有标签
标签对象.select_one(css选择器) - 获取指定标签中css选择器选中的第一个标签
# 获取整个网页中的P标签返回一个列表
result = soup.select('p')
# 获取整个网页中的第一个标签,返回值是标签对象----->也就是整个网页中的第一个<p></p>标签
result = soup.select_one('p')
# 获取整个网页中<div></div>标签下的所有后代<p></p>标签
result = soup.select('div p')
# 获取box1中的所有标签
box1 = soup.select_one('#box1') # 此时是将网页中id='box1'标签下的所有标签看作一个整体(类似于一个盒子)
result = box1.select('p') # 获取box1下的所有<p></p>标签
p1 = soup.select_one('span>p') # 获取整个网页中<span></span>标签下的第一个<p></p>标签
a1 = box1.select_one('a') # 获取box1中的第一个<a></a>标签
3.获取标签内容和标签属性
标签对象.text - 获取标签内容
标签对象.attrs[属性名] - 获取标签指定属性的值
print(a1.text) # '我是超链接3'---a1标签在网页中对应的内容
print(a1.attrs['href']) # 'https://www.baidu.com'---获取a1标签中'href'属性对应的属性值
selenium获取标签:
获取标签对象导入: from selenium.webdriver.common.by import By
selenium获取标签得创建浏览器对象
浏览器对象.b.find_element(获取方式, 数据) — 返回符合条件的第一个标签,结果是标签对象
浏览器对象.b.find_elements(获取方式, 数据) — 返回符合条件的所有标签,结果是列表,列表中的元素是标签对象
1.获取方式:
By.ID - 通过ID属性值获取标签
By.CLASS_NAME - 通过class属性值获取标签
By.CSS_SELECTOR - 通过css选择器获取标签
By.LINK_TEXT - 通过a标签的标签内容获取标签
By.PARTIAL_LINK_TEXT - 通过a标签的标签内容获取标签
2.操作标签
1)输入框输入内容:输入框对应的标签.send_keys(‘内容’)
2)点击标签:标签对象.click()
3.获取标签内容和标签属性
find_element仅仅能够获取元素,不能够直接获取其中的数据
获取属性值时通过定位获取的标签对象的get_attribute
函数,传入属性名,来获取属性的值--------->不能直接用标签对象.attrs[属性名]
标签对象.text—> 即element.text
------------获取标签内容
标签对象.get_attribute(“属性名”) —>即:element.get_attribute(“属性名”)
-----------获取标签指定属性的值
解析数据方式:
1.正则-------> day1-正则
2.bs4(css选择器,依赖lxml库)------> 如上解析库bs4部分
3.XPath------> day5-XPath
请求头headers
我们访问一个网页的时候,点击进去就是一个完整的浏览过程。当我们想要获取网页数据的时候,就要跟这种浏览过程一样,不然网页会把我们阻拦在外面。header就是帮助我们完成这样浏览过程的一个工具。给爬虫加一个header请求头,是常规的反爬的方法之一,相当于我们进去这个网页的服务器本身,假装自己本身在浏览网站信息。
发送请求
添加header: a. 浏览器伪装(user-agent)、b.免密登录(cookie)、 c. 设置代理(proxies)
a. 浏览器伪装(user-agent)
import requests
headers = {
# 发送请求的时候在请求头中添加cookie值
'cookie': 'bid=58Gyjz_NAcA; ll="118318"; douban-fav-remind=1; viewed="36164018_36221918"; ap_v=0,6.0',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'
}
# 可以自己在网页中查---检查---网络--->>
response = requests.get('https://movie.douban.com/top250', headers=headers)
b.免密登录(cookie) <-----为了爬网页时跳过登录界面
requests:
# requests自动登录步骤
# 第一步:人工对需要自动登录网页进行登录
# 第二步:获取这个网站登录后的cookie信息
# 第三步:发送请求的时候在请求头中添加cookie值
# 如上面代码部分
selenium:
selenium获取Cookie:
from selenium.webdriver import Chrome
# 1.创建浏览器打开需要自动登录的网页
b = Chrome()
b.get('https://www.taobao.com')
# 2.留足够长的时候,人工完成登录(必须得保证b指向的窗口的网页中能看到登录以后的信息)
input('是否已经完成登录:') # ---此时在跳出来的网页上进行登录以获取Cookie,登陆后回车让后面的代码继续运行
# 3.获取登录成功后的cookie信息,保存到本地文件
result = b.get_cookies()
with open('files/taobao.txt', 'w', encoding='utf-8') as f:
f.write(str(result))
selenium使用Cookie:
# 接着获取Cookie的代码部分---使用Cookie
# 获取本地保存的cookie
with open('files/taobao.txt', encoding='utf-8') as f:
result = eval(f.read())
# 添加cookie
for x in result:
b.add_cookie(x)
# 重新打开网页
b.get('https://www.taobao.com') # 已免登录
input('end:')
c. 设置代理(proxies) <------解决IP被封
requests:
import requests
headers = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'
}
# 创建代理
proxies = {
'https': '116.140.52.224:4513'
}
# 使用代理ip发送请求
res = requests.get('https://movie.douban.com/top250?start=0&filter=', headers=headers, proxies=proxies)
print(res.text)
selenium:
from selenium.webdriver import Chrome, ChromeOptions
options = ChromeOptions()
# 设置代理
options.add_argument('--proxy-server=http://180.127.245.154:4515')
b = Chrome(options=options)
b.get('https://movie.douban.com/top250?start=0&filter=')