0开始学py爬虫(学习笔记)(第2部分)(爬下来存储完了后)

编程入门 行业动态 更新时间:2024-10-26 22:29:23

0开始学py<a href=https://www.elefans.com/category/jswz/34/1770264.html style=爬虫(学习笔记)(第2部分)(爬下来存储完了后)"/>

0开始学py爬虫(学习笔记)(第2部分)(爬下来存储完了后)

复习(只有5张图,4端代码)

import csv
csv_file = open('demo.csv','w',newline='')
writer = csv.writer(csv_file)
writer.writerow(['电影','豆瓣评分'])
csv_file.close()

import csv
csv_file = open('demo.csv','r',newline='')
reader=csv.reader(csv_file)
for row in reader:print(row)

import openpyxl 
wb = openpyxl.Workbook() 
sheet = wb.active
sheet.title ='new title'
sheet['A1'] = '漫威宇宙'
rows = [['美国队长','钢铁侠','蜘蛛侠','雷神'],['是','漫威','宇宙', '经典','人物']]
for i in rows:sheet.append(i)
print(rows)
wb.save('Marvel.xlsx')

import openpyxl
wb = openpyxl.load_workbook('Marvel.xlsx')
sheet = wb['new title']
sheetname = wb.sheetnames
print(sheetname)
A1_value = sheet['A1'].value
print(A1_value)

爬取知乎大v张佳玮的文章“标题”、“摘要”、“链接”,并存储到本地文件。

# 爬取知乎大v张佳玮的文章“标题”、“摘要”、“链接”,并存储到本地文件。
import requests,openpyxl
from bs4 import BeautifulSoupheaders = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36',# 标记了请求从什么设备,什么浏览器上发出}#列表保存数据
_list={"title":"","href":"","zhaiyao":""
}
list_act=[]#插入xlsx表格的数据workbook=openpyxl.Workbook()
sheet=workbook.active
sheet.name="wenzhang"
sheet['A1']="文章标题"
sheet['B1']="文章摘要"
sheet['C1']="文章链接"
for i in range(0,100,20):params={"include": "data[*]ment_count,suggest_edit,is_normal,   thumbnail_extra_info,thumbnail,can_comment,comment_permission, admin_closed_comment,content,voteup_count,created,updated,   upvoted_followees,voting,review_info,is_labeled,label_info;data[*] .author.badge[?(type=best_answerer)].topics","offset": i,"limit": 20,"sort_by": "created"}res=requests.get('', headers=headers,params=params)json_data=res.json()for item in json_data['data']:_list['title']=item['title']_list['zhaiyao']=item['excerpt']_list['href']=item['url']list_act.append([str(_list['title']),str(_list['zhaiyao']),str(_list['href'])])for item in list_act:sheet.append(item) 
workbook.save('文章.xlsx')

真的第2部分开始

发表博客评论的三个重点

登录的cookies其实包含了很多名称和值,真正能帮助我们发表评论的cookies,只是取了登录cookies中某一小段值而已。所以登录的cookies和评论成功后,你在【wp-comments-post.php】里的headers面板中看到的cookies是不一致的
import requests
#引入requests。
url = ' /wp-login.php'
#把请求登录的网址赋值给url。
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
}
#加请求头,前面有说过加请求头是为了模拟浏览器正常的访问,避免被反爬虫。
data = {
'log': 'spiderman',  #写入账户
'pwd': 'crawler334566',  #写入密码
'wp-submit': '登录',
'redirect_to': '/wp-admin/',
'testcookie': '1'
}
#把有关登录的参数封装成字典,赋值给data。
login_in = requests.post(url,headers=headers,data=data)
#用requests.post发起请求,放入参数:请求登录的网址、请求头和登录参数,然后赋值给login_in。
cookies = login_in.cookies
#提取cookies的方法:调用requests对象(login_in)的cookies属性获得登录的cookies,并赋值给变量cookies。url_1 = '/wp-comments-post.php'
#我们想要评论的文章网址。
data_1 = {
'comment': input('请输入你想要发表的评论:'),
'submit': '发表评论',
'comment_post_ID': '7',
'comment_parent': '0'
}
#把有关评论的参数封装成字典。
comment = requests.post(url_1,headers=headers,data=data_1,cookies=cookies)
#用requests.post发起发表评论的请求,放入参数:文章网址、headers、评论参数、cookies参数,赋值给comment。
#调用cookies的方法就是在post请求中传入cookies=cookies的参数。
print(comment.status_code)
#打印出comment的状态码,若状态码等于200,则证明我们评论成功。

session及其用法

当登錄網易雲賬號,并勾选“记住我”,服务器就会生成一个cookies和spiderman这个账号绑定。接着,它把这个cookies告诉你的浏览器,让浏览器把cookies存储到你的本地电脑。当下一次,浏览器带着cookies访问網易雲網頁版,服务器会知道你是spiderman,你不需要再重复输入账号密码,即可直接访问。
当然,cookies也是有时效性的,过期后就会失效。你应该有过这样的体验:哪怕勾选了“记住我”,但一段时间过去了,网站还是会提示你要重新登录,就是之前的cookies已经失效。

登录的cookies其实包含了很多名称和值,真正能帮助我们发表评论的cookies,只是取了登录cookies中某一小段值而已。所以登录的cookies和评论成功后,你在【wp-comments-post.php】里的headers面板中看到的cookies是不一致的。

下面這段代碼是執行不了的(但是可以參考如何拿到cookies然後請求)
import requestsurl=''headers={"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36"
}data={"params": "L9qMpEfCzXB3OGu5hYnVuX5rxokdjc+tQb0dKpSyaS7ujBLNe2z22k845rcoyuBkJitaq2VKDa91eg6Vn0B4kVl4rT8AtjrGucvCBpBYg6w4JI3nx9wc9631535n1ak0MtxKKJ9nmPT19QB6ERHIXxS+de4gX52UI1gMfBRxuDrxeA11mKX5+esZxWU13fYs39QisoouRxpxPqr/yVGHT7Lp+k4EqnG3Vti2Et3hjMM1tPbJi9GG0M4PiHb7HZmFDe60nlvErvhS1wvTBhDldnde1w/v5tjWrHuoyDiE+ruOExM6JRv346s5p3ma2kyYdP2CbzT5lCUHl6UJ1L92olziSMeNI/MdBvfwT5QSCZrkJCKFrjJMoO/DAJiGpVg3SkXivhfrY1P/PKAlhsM3EX0oY3ggyQ4nhaRzvcT8IaIr6B/qonloA4qAivFlYKHAs1IcN5BmTTCkA9U+V9y9t8FUW4IX3C/lUzee3ltF+wR92Qp3y9x45GM/Dk2CObVV2LBJjkPP+nkTbE/mRu9syrrCCweiQT5rOYAEt98yCKw=","encSecKey": "dd9145703760a9fcdbaa2382858917c2de2619782c358420eb8e45e98066236e95f432ede558675aae0882b62c4a0d52f978e84ad1d6725fc9790c74a6c1def5e2ddf760a312e187e243bdab1596ae993848aef7fe2081aafc4290387b361f520304baabf07ec12e746e5daa8e0e456821633fa00cee02510c2426d11ec962a0"
}
login_in=requests.post(url,headers,data)
cookies=login_in.cookiesurl_1 = '/wp-comments-post.php'
data_1 = {
'comment': input('请输入你想要发表的评论:'),
'submit': '发表评论',
'comment_post_ID': '7',
'comment_parent': '0'
}
comment=requests.post(url_1,data=data_l,cookies=cookies)

session

#用requests.session()创建session对象,相当于创建了一个特定的会话,帮我们自动保持了cookies。

保存cookies

import requests,json
#引入requests和json模块。
session = requests.session()   
url = ' /wp-login.php'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
data = {
'log': input('请输入你的账号:'),
'pwd': input('请输入你的密码:'),
'wp-submit': '登录',
'redirect_to': '/wp-admin/',
'testcookie': '1'
}
session.post(url, headers=headers, data=data)cookies_dict = requests.utils.dict_from_cookiejar(session.cookies)
#把cookies转化成字典。
print(cookies_dict)
#打印cookies_dict
cookies_str = json.dumps(cookies_dict)
#调用json模块的dumps函数,把cookies从字典再转成字符串。
print(cookies_str)
#打印cookies_str
f = open('cookies.txt', 'w')
#创建名为cookies.txt的文件,以写入模式写入内容。
f.write(cookies_str)
#把已经转成字符串的cookies写入文件。
f.close()
#关闭文件。

讀取cookies

cookies_txt = open('cookies.txt', 'r')
#以reader读取模式,打开名为cookies.txt的文件。
cookies_dict = json.loads(cookies_txt.read())
#调用json模块的loads函数,把字符串转成字典。
cookies = requests.utils.cookiejar_from_dict(cookies_dict)
#把转成字典的cookies再转成cookies本来的格式。
cookies = session.cookies
#获取cookies:就是调用requests对象(session)的cookies属性。
import requests,json
session = requests.session()
#创建会话。
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
}
#添加请求头,避免被反爬虫。
try:
#如果能读取到cookies文件,执行以下代码,跳过except的代码,不用登录就能发表评论。cookies_txt = open('cookies.txt', 'r')#以reader读取模式,打开名为cookies.txt的文件。cookies_dict = json.loads(cookies_txt.read())#调用json模块的loads函数,把字符串转成字典。cookies = requests.utils.cookiejar_from_dict(cookies_dict)#把转成字典的cookies再转成cookies本来的格式。cookies = session.cookies#获取会话下的cookiesexcept FileNotFoundError:
#如果读取不到cookies文件,程序报“FileNotFoundError”(找不到文件)的错,则执行以下代码,重新登录获取cookies,再评论。url = ' /wp-login.php'#登录的网址。data = {'log': input('请输入你的账号:'),'pwd': input('请输入你的密码:'),'wp-submit': '登录','redirect_to': '/wp-admin/','testcookie': '1'}#登录的参数。session.post(url, headers=headers, data=data)#在会话下,用post发起登录请求。cookies_dict = requests.utils.dict_from_cookiejar(session.cookies)#把cookies转化成字典。cookies_str = json.dumps(cookies_dict)#调用json模块的dump函数,把cookies从字典再转成字符串。f = open('cookies.txt', 'w')#创建名为cookies.txt的文件,以写入模式写入内容f.write(cookies_str)#把已经转成字符串的cookies写入文件f.close()#关闭文件url_1 = '/wp-comments-post.php'
#文章的网址。
data_1 = {
'comment': input('请输入你想评论的内容:'),
'submit': '发表评论',
'comment_post_ID': '7',
'comment_parent': '0'
}
#评论的参数。
session.post(url_1, headers=headers, data=data_1)
#在会话下,用post发起评论请求。

selenium是什么,控制浏览器,做出自动打开、输入、点击等操作,就像是有一个真正的用户在操作一样。

它可以真实地打开一个浏览器,等待所有数据都加载到Elements中之后,再把这个网页当做静态网页爬取就好了

# 本地Chrome浏览器设置方法
from selenium import webdriver #从selenium库中调用webdriver模块
driver = webdriver.Chrome() # 设置引擎为Chrome,真实地打开一个Chrome浏览器driver.get('/') # 打开网页
driver.close() # 关闭浏览器

就像是,每次打开冰箱门,把东西放进去之后,都要记得关上门,使用selenium调用了浏览器之后也要记得关闭浏览器。

首先明显的一个不同即是:selenium所解析提取的,是Elements中的所有数据,而BeautifulSoup所解析的则只是Network中第0个请求的响应。

from selenium import webdriver
import timedriver=webdriver.Chrome()driver.get('/') # 访问页面
time.sleep(2) # 等待2秒
label = driver.find_element_by_tag_name('label') # 解析网页并提取第一个<lable>标签
print(label.text) # 打印label的文本
driver.close() # 关闭浏览器

find_element_by_link_text:通过链接文本获取超链接
# 如<a href="spidermen.html">你好,蜘蛛侠!</a>
# 可以使用find_element_by_link_text('你好,蜘蛛侠!')find_element_by_partial_link_text:通过链接的部分文本获取超链接
# 如<a href="/">你好,蜘蛛侠!</a>
# 可以使用find_element_by_partial_link_text('你好')
driver.get('/') # 访问页面
time.sleep(2) # 等待2秒
label = driver.find_element_by_tag_name('label') # 解析网页并提取第一个<lable>标签中的文字
print(type(label)) # 打印label的数据类型
print(label.text) # 打印label的文本
print(label) # 打印label
driver.close() # 关闭浏览器

<class ‘selenium.webdriver.remote.webelement.WebElement’>、label的文本(提示:吴枫)、以及label本身。
icon
可见,提取出的数据属于WebElement类对象,如果直接打印它,返回的是一串对它的描述。
icon
而它与BeautifulSoup中的Tag对象类似,也有一个属性.text,可以把提取出的元素用字符串格式显示。
icon
还想补充的是,WebElement类对象与Tag对象类似,它也有一个方法,可以通过属性名提取属性的值,这个方法是.get_attribute()。

拿到多个的时候用elements

driver.page_source # 获取完整渲染的网页源代码,使用selenium获取到的网页源代码,本身已经是字符串了。

from selenium import webdriver
from bs4 import BeautifulSoup
import timedriver=webdriver.Chrome()driver.get("/")time.sleep(2)pageSource=driver.page_source#不仅仅可以获取到渲染的页面,还说明了driver是以方法来取值print(type(pageSource))
print(pageSource)
driver.close()

操作浏览器提交表单

.send_keys() # 模拟按键输入,自动填写表单
.click() # 点击元素
.clear()#用于清除元素的内容

更多推荐

0开始学py爬虫(学习笔记)(第2部分)(爬下来存储完了后)

本文发布于:2024-03-08 07:53:46,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1720270.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:爬虫   学习笔记   爬下   py

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!