requests库爬取当当商品信息I

2023-10-19 15:10

本文主要是介绍requests库爬取当当商品信息I,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

requests库爬取当当商品信息(requests,lxml)

简单记录一下实习学习爬虫的内容,本次学习包括requests库爬取当当,豆瓣等网站的信息,使用jieba对爬取到到的评论的中文进行处理,使用wordcloud对爬取到的数据绘制对应的词云,还包括lxml对爬取到的网站内容进行筛选,其余部分会分次上传。

1,使用requests库向网站发起请求
使用到的库——requests,利用requests的get方法,向对应网站的服务器发起访问,从而获取到对应网站的信息,实质上就是一个模拟游览器对对应网站,发起访问的过程。

#-*-coding=utf-8-*-
#@Time: 2020/11/2 15:48
#@File : spider_dangdang.py
#@Software: PyCharm
#@Author:miko
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36"}
def spider_all(url):response=requests.get(url,headers=headers)juge=response.status_codeprint(juge)print(response.text)

headers能够在游览器的调试器里面找到,点击f12进入调试台,进入network也就是网络窗口,然后随便点击一个文件,找到标头里面的user-agent,放到你代码里面就能解决部分网站无法获得信息的问题,requests能将你传入的headers传给对方服务器,这是一个简单的伪装(告诉别人服务器你的操作系统访问游览器的信息,对方服务器能根据你的操作系统传会指定格式的网页代码)。
如果没有显示文件,直接刷新网站,就出现文件了
在这里插入图片描述
requests.get方法获取到的访问是一个response类型,这个类有status_code的属性,能得到访问到的网站的状态码,200是访问成功,400,500,404等是访问失败,也就是你爬虫被发现了。
而返回的这个response类型中的text属性,能让你得到网页的源码,我们也就是利用这个方法去得到网页的源码,对网页源码中我们需要的信息进行筛选和处理。所以,我们会用到lxml库中的html这个包。
2,使用lxml库中的html包对获取到的网页源码进行信息筛选

lxml库相对于使用re,也就是正则表达式对网站的源码信息进行处理方便了很多,不要求会正则,只需要对网站结构熟悉就能上手。
html包中的fromstring()传入的参数就是你的源码,这个方法能能把你的源码转变为一个lxml.html.HtmlElement类型,你就可以利用这个类的xpath方法去根据网页的标签结构去获取到对应的信息
"//“代表的是从任何地方开始寻找,”@"能允许你获得标签内属性的值,"text()"能允许你获取到标签内的信息。

#
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36"}
def spider_all(url):response=requests.get(url,headers=headers)print(response.status_code)html_code=response.textdatas=html.fromstring(html_code)print(type(datas))data=etree.HTML(html_code)print(type(data))
spider_all("https://movie.douban.com/top250?start=0&filter=")

etree的HTML方也能达到fromstring的效果,创建一个lxml.etree._Element类,也能使用xpath方法去html网页代码结构中去寻找你所需要的信息。
3,解析url实现翻页功能
爬虫中往往是需要爬取多个页面的,而这个爬取多种页面的实现方式目前作者我只知道两种,一种是通过解析url,不断的改变网页url去实现翻页的功能,而我们可以观察一下当当的url

http://search.dangdang.com/?key=python%B1%E0%B3%CC%20%B4%D3%C8%EB%C3%C5%B5%BD%CA%B5%BC%F9&act=input

观察这个商品搜索页面我们就能发现,有一大堆%?&等符号,这些符号是url传参的形式进行前后端交互的表现,前端利用url,也就是你的地址,在这个地址内包含后端需要的信息,一般传参的部分是从?开始,大家可以做个参考,而观察这个url,其中的key=也就是你在搜索框内输入并提交上去的内容(大家可以多次去对页面进行各种各样的操作,去观察这个url,改里面的值,猜这些参数的意思)而这个参数的值是经过解码的,编码是url编码格式,所以这个地方就是我们的下手点,根据这个url我们能控制搜索的商品信息(是不是很神奇?)
而我们尝试翻到下一页,我们就会发现url多出了一个参数

&page_index=2

是不是感觉有点奇妙,没猜错,这个就是当前的页码。
所以这个地方也就是我们入手的地方,这样能允许我们去访问到多页的内容,去控制访问多少页,而如果想要爬完整个网页,我不知道总共多少页怎么办,那么就有一个更简便的方法了。

4,控制网页翻页,找到下一页的url链接地址
找到这个链接的位置的方式仍然是利用f12打开调试器,锁定到翻页按钮上,找到对应url爬下来,不断的更改你爬虫的url,而xpath寻找的特性是如果没找到会返回None值,而我们就可以利用这个None值进行判断,在恰当的地方终止爬虫,达到爬取全部内容的效果。

next_page=item.xpath('//div[@class="paging"]/ul[1]/li[@class="next"]/a/@href')if len(next_page)==0:url=Noneelse:url="http://search.dangdang.com"+next_page[0]
#此处代码为当当网商品信息爬取的测试实例。
#-*-coding=utf-8-*-
#@Time: 2020/11/2 15:48
#@File : spider_dangdang.py
#@Software: PyCharm
#@Author:miko
import requests
from lxml import html
import time
import urllib
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36"}
def spider_all(url):response=requests.get(url,headers=headers)juge=response.status_codeinformation=[]if juge==200:html_code=response.textdata=html.fromstring(html_code)for i in range(1,61):product_code=data.xpath("//div[@id='search_nature_rg']/ul/li[@ddt-pit="+str(i)+"]")shop_nub=len(product_code)print(shop_nub)for items in product_code:item={}title=items.xpath("./p[@class='name']/a/@title")[0]item["title"]=titlelink=items.xpath("./p[@class='name']/a/@href")item["link"]=linkprice=items.xpath("./p[@class='price']/span/text()")item["price"]=priceshop=items.xpath("./p[@class='search_shangjia']/a/@title")item["shop"]=shopinformation.append(item)time.sleep(0.1)return informationelse:print("the website is not allow you to access")#single_onedef spider_title(url):response=requests.get(url,headers=headers)print(response.status_code) #获取到网页状态码#404 未找到网页 200 可以访问 500服务器内部有问题html_code=response.textdata=html.fromstring(html_code)title_list=[]for i in range(1,61):title=data.xpath("//div[@id='search_nature_rg']/ul/li[@ddt-pit="+str(i)+"]/p/a/@title")[0]title_list.append(title)time.sleep(0.1)return title_list
def spider_prise(url):response=requests.get(url)print(response.status_code) #获取到网页状态码#404 未找到网页 200 可以访问 500服务器内部有问题html_code=response.textdata=html.fromstring(html_code)price_list=[]for i in range(1,61):price=data.xpath("//div[@id='search_nature_rg']/ul/li[@ddt-pit="+str(i)+"]/p[@class='price']/span/text()")[0]price_list.append(price)time.sleep(0.1)return price_list
if __name__=="__main__":#对中文进行url的再编码# search_book=input().encode()# data=urllib.parse.quote_plus(search_book)# print(data)data=input()for i in range(1,2):title=spider_title("http://search.dangdang.com/?key=python%B1%E0%B3%CC%20%B4%D3%C8%EB%C3%C5%B5%BD%CA%B5%BC%F9&act=input&page_index="+str(i))print(title)price=spider_all("http://search.dangdang.com/?key=python%B1%E0%B3%CC%20%B4%D3%C8%EB%C3%C5%B5%BD%CA%B5%BC%F9&act=input&page_index=1")print(price)for i in range(1,2):items=spider_all("http://search.dangdang.com/?key=python%B1%E0%B3%CC%20%B4%D3%C8%EB%C3%C5%B5%BD%CA%B5%BC%F9&act=input&page_index="+str(i))print(items)

这个地方的代码是整个当当网爬虫的代码,有需要自取,其中有些地方用到的库并未在这份笔记内写出,有想要了解的请看文章最后的链接(PS:最近有点忙,接下来的代码会短短续续的上传)。

#此处是实际项目使用的爬虫代码,将爬虫写为了类,利用类的特性。
#-*-coding=utf-8-*-
#@Time: 2020/11/4 11:47
#@File : spider_dangdang.py
#@Software: PyCharm
#@Author:miko
import urllib
from selenium import webdriver
import requests
from lxml import html
import time
import jieba
import imageio
from wordcloud import WordCloud
headers={"Request URL": "https://movie.douban.com/cinema/later/yingkou/","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36",}
class Spider_DD:def __init__(self,name):data=nameself.url = f"http://search.dangdang.com/?key={data}&act=input&page_index=1"self.headers=headersself.links=[]def spider(self,url):print(url)response=requests.get(url)time.sleep(1.5)print(response.status_code)html_code=response.textdata=html.fromstring(html_code)items = data.xpath('//div[@id="search_nature_rg"]/ul/li')print(len(items))information = []juge_lpage=Nonefor item in items:dic = {}title=item.xpath('./a/@title')[0]dic["name"] = titlelink=item.xpath('./a/@href')[0]dic["link"] = linkself.links.append(link)price=item.xpath('./p[@class="price"]/span[@class="search_now_price"]/text()')if len(price)==0:price=item.xpath('./div[@class="ebook_buy"]/p/span[@class="search_now_price"]/text()')[0]price=price.replace("¥","")dic["price"]=float(price)else:price = price[0].replace("¥", "")dic["price"]=float(price[0])shop = item.xpath('./p[@class="search_shangjia"]/a/text()')if shop == []:dic["shop"] = "自营"else:dic["shop"] = shop[0]information.append(dic)next_page=item.xpath('//div[@class="paging"]/ul[1]/li[@class="next"]/a/@href')if len(next_page)==0:self.url=Noneelse:self.url="http://search.dangdang.com"+next_page[0]# if len(items)==60:#     juge_lpage = "http://search.dangdang.com" + str(data.xpath('//div[@class="paging"]/ul/li[@class="next"]/a/@href')[0])#     print(juge_lpage)#     if len(juge_lpage)==0:#         self.url=None#     else:#         self.url=juge_lpage# else:self.url=Nonereturn informationdef get_comments(self,com_url="http://product.dangdang.com/24003310.html"):url=com_urlopt = webdriver.ChromeOptions()  # 创建浏览器# 阻止网页自动关闭# 关闭“chrome正受到自动测试软件的控制”# V75以及以下版本# option.add_argument('disable-infobars')# V76以及以上版本opt.add_experimental_option('useAutomationExtension', False)opt.add_experimental_option('excludeSwitches', ['enable-automation'])# 不自动关闭浏览器opt.add_experimental_option("detach", True)driver = webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe",options=opt)  # 创建浏览器对象driver.get(url)  # 打开网页driver.maximize_window()  # 最大化窗口time.sleep(3)  # 加载等待# #滚动到底部js = "return action=document.body.scrollHeight"height = driver.execute_script(js)# 将滚动条调整至页面底部driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')response = requests.get(url, headers=self.headers)time.sleep(1)print(response.status_code)html_code = driver.page_sourcedata=html.fromstring(html_code)nub=10comments = ""i=0while nub==10:boxs=data.xpath('//div[@id="comment_list"]/div[1]/div')nub=len(boxs)for item in boxs:try:comments+=item.xpath('./div[1]/div[2]/span/a/text()')[0]except IndexError:continuetry:driver.find_element_by_xpath('//div[@id="comment_list"]/div[2]/div/a[last()]').click()except :breaktime.sleep(1)i+=1if i==10:breakdriver.quit()return commentsdef drawing(self,comments,i):data_list = jieba.lcut(comments)data = " ".join(data_list)mask = imageio.imread("./file/yuansheng.png")  # 蒙版cloud = WordCloud(background_color="pink",width=1200,height=1200,font_path="msyh.ttc",mask=mask)dic = {}for str in data_list:if 2 <= len(str) <= 3:if dic.get(str) != None:dic[str] += 1else:dic[str] = 1lists = list(dic.items())lists.sort(key=lambda x: x[1], reverse=True)print(lists)try:cloud.generate(data).to_file(f"./file/img/draw{i.strip()}.png")except:pass#这里之后还得进行优化,处理重名,多数据的情况def run(self):datas=[]i=0while self.url!=None:print("success")datas.extend(self.spider(self.url))if i ==10:breaki+=1datas.sort(key=lambda x:x["price"])# for i in datas:#     comments=self.get_comments(i["link"])#     self.drawing(comments,i["name"])#     print("success")return datas
if __name__ == '__main__':search_book = "python"data=Spider_DD(search_book)datas=data.run()print(datas)

这篇关于requests库爬取当当商品信息I的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/240604

相关文章

urllib与requests爬虫简介

urllib与requests爬虫简介 – 潘登同学的爬虫笔记 文章目录 urllib与requests爬虫简介 -- 潘登同学的爬虫笔记第一个爬虫程序 urllib的基本使用Request对象的使用urllib发送get请求实战-喜马拉雅网站 urllib发送post请求 动态页面获取数据请求 SSL证书验证伪装自己的爬虫-请求头 urllib的底层原理伪装自己的爬虫-设置代理爬虫coo

【python requests警告】python3.x requests库取消ssl验证,InsecureRequestWarning: Unverified HTTPS request is be

警告信息: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warni

【python requests错误】Caused by SSLError(SSLError(bad handshake: SysCallError(104, 'ECONNRESET')

错误描述: 在发送get请求时错误,执行下面一句时报错了: response = requests.get(image_url) 原因HTTPSConnectionPool(host='test-kkbuluo-resource.cdn.hzmltest.com', port=443): Max retries exceeded with url: /IMCORE/RESOURCE/LOG

Python实现requests-post(Multipart/form-data格式)boundary=----WebKitForm

这种模式相比于普通post,实在太烦了,这种基本都是用来上传文件(包括图片、excel、doc等) import requestsfrom requests_toolbelt.multipart.encoder import MultipartEncoderimport jsonurl = 'http://www.requests-post.com'headers = {'Accept':

Requests库对session的支持

场景:如何获取登录时响应消息中的sessionid,以及如何在后续请求中把sessionid添到cookie中 Requests库提供了一个Session类,通过requests库中的session对象,requests库会自动帮我们保存服务端返回的cookie数据(set-cookie里的内容),也会在HTTP发出请求时自动在消息头中放入cookie数据。 用py模拟客户端接收响应消息:

当当图书福利券,满400减230,别说我没告诉你!

1024程序员节 当当网计算机图书 每满100减50! 满200减100! 满300-150! 机械工业出版社华章公司联合当当网特意为【大数据技术与架构】用户申请了一批可与满减叠加使用的“满200减30”的图书优惠码,优惠码使用后相当于: 400减230 !!!   优惠码:【YRMQMY】(注意区分大小写) 使用渠道:当当app和当当小程序 使用时间:10月22-10月31 本活动满减与礼券

python+requests实现接口测试 - get与post请求使用( params

原 http://www.mamicode.com/info-detail-1755093.html 简介:Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发

爬虫二:获取豆瓣电影Top250(Requests+XPath+CSV)

描述: 在上一篇获取豆瓣图书Top250的基础上,获取豆瓣电影Top250的数据并将结果写入CSV文件中。 代码: # -*- coding: UTF-8 -*-import requestsfrom lxml import etreeimport timeimport csv# 从网页上获取电影数据moviedata = []count = 0for i in range(1

爬虫一:获取豆瓣图书Top250(Requests+XPath)

目的: 获取豆瓣图书Top250的所有书目信息。 豆瓣网址:https://book.douban.com/top250 代码: import requestsfrom lxml import etreeimport timefor i in range(10):url = 'https://book.douban.com/top250?start=' + str(25*i)data

【淘宝采集项目经验分享】商品评论采集 |商品详情采集 |关键词搜索商品信息采集

商品评论采集  1、输入商品ID 2、筛选要抓取评论类型 3、填写要抓取的页数 4、立刻提交-启动测试 5、等爬虫结束后就可以到“爬取结果”里面下载数据 商品详情采集  1、输入商品ID 2、立刻提交-启动爬虫 3、等爬虫结束后就可以到“爬取结果”里面下载数据 taobao.item_get 公共参数 名称类型必须描述keyString是调用key(必须