pythonxpath循环_用Python来爬虫?文科生也学得会!

pythonxpath循环_用Python来爬虫?文科生也学得会!

2023年6月29日发(作者:)

pythonxpath循环_⽤Python来爬⾍?⽂科⽣也学得会!前段时间想看下最近⼏年的阅读清单,萌⽣了⽤Python写爬⾍程序的想法,于是就有了这篇⽂章。起因两周前,⼀位同学问⼩央,平时有没有写过技术类博客。⼩央⼤⾔不惭,随⼝就说下次可以尝试。这不,⾃⼰挖的坑,哭也得填上。正巧,最近要统计⾃⼰的阅读记录,⼀个个看多费劲呀,如果能写个爬⾍程序,⾃动化获取数据,岂不美哉。⼀瓶不响半瓶晃荡,技术渣⼩央,刚有点⼩成绩的时候,就忍不住的要分享给⼩⽩们了。⼀、爬⾍思路爬⾍是指请求⽹站并获取数据的⾃动化程序,⼜称⽹页蜘蛛或⽹络机器,最常⽤领域是搜索引擎,它的基本流程是明确需求-发送请求-获取数据-解析数据-存储数据。⽹页之所以能够被爬取,主要是有以下三⼤特征:1. ⽹页都有唯⼀的URL(统⼀资源定位符,也就是⽹址)进⾏定位2. ⽹页都使⽤HTML(定位超⽂本标记语⾔)来描述页⾯信息3. ⽹页都使⽤HTTP/HTTPS(超⽂本传输协议)协议来传输HTML数据因此,只要我们能确定需要爬取的⽹页 URL地址,通过 HTTP/HTTPS协议来获取对应的 HTML页⾯,就能提取 HTML页⾯⾥有⽤的数据。在⼯具的选择上,任何⽀持⽹络通信的语⾔都可以写爬⾍,⽐如 c++、 java、 go、 node等,⽽ python则是⽤的最多最⼴的,并且也诞⽣了很多优秀的库和框架,如 scrapy、 BeautifulSoup 、 pyquery、 Mechanize等。BeautifulSoup是⼀个⾮常流⾏的 Pyhon 模块。该模块可以解析⽹页,并提供定位内容的便捷接⼝。但是在解析速度上不如 Lxml模块,因为后者是⽤C语⾔编写,其中 Xpath可⽤来在 XML⽂档中对元素和属性进⾏遍历。综上,我们本次爬取⼯具选择 Python,使⽤的包有 requests、 Lxml、 xlwt、 xlrd,分别⽤于模拟账户登录、爬取⽹页信息和操作 Excel进⾏数据存储等。⼆、实战解析1. 模拟账户登录因为要爬取个⼈账户下的读书列表,我们⾸先要让 Python创建⽤户会话,⽤于在跨请求时保存Cookie值,实现从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开。其次要处理请求头 Header,发送附带账户名和密码的 POST请求,并获取登陆后的 Cookie值,保存在会话⾥。登陆进去之后,我们就可以长驱直⼊进⾏爬⾍了;否则,它就会因请求不合法报错。代码⽰例# 1. 创建session对象,可以保存Cookie值ssion = n()# 2. 处理 headersuser_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'headers={'User-Agent':user_agent}# 3. 需要登录的⽤户名和密码data = {"email":"⾖瓣账户名XX", "password":"⾖瓣密码XX"}# 4. 发送附带⽤户名和密码的请求,并获取登录后的Cookie值,保存在ssion⾥("/accounts/login", data = data)respon=(url,headers=headers)2. 分析⽹页结构进⼊读书页⾯,右键选择“检查”,可以看到如下界⾯:当⿏标定位在某⼀⾏代码时,就会选中左侧对应模块。所有图书内容的标签,存放在⼀个类名为 id="content"的div盒⼦, class="subject-item"的li盒⼦。同样⽅法,我们也可以找到书名、作者、出版社、何时读过、评论信息,分别对应哪些标签。最终,我们通过CSS路径提取来提取对应标签数据。代码⽰例#因为每页有15本书,所以这⾥做了个循环for tr in trs:i = 1while i <= 15:data = []title = ("./ul/li["+str(i)+"]/div[2]/h2/a/text()")info = ('./ul/li['+str(i)+']/div[2]/div[1]/text()')date = ('./ul/li['+str(i)+']/div[2]/div[2]/div[1]/span[2]/text()')comment = ('./ul/li['+str(i)+']/div[2]/div[2]/p/text()')3. ⾃动翻页,循环爬取因为要爬取历史读书清单,当爬完⼀页的时候,需要程序能够实现⾃动翻页功能。⼀种⽅法是让它⾃动点击下⼀页,但这个学习成本有点⾼,吃⼒不讨好;另⼀种⽅法,就是寻找⽹页之间的规律,做个循环即可。以央之姑娘的⾖瓣账户为例:很容易发现⽹页之间的区别仅在于start值不同,第⼀页的 start=0,第⼆页 start=15,以此类推,最后⼀页,即19页的 start=(19-1)*15=270.找到这样的规律就很容易实现Python⾃动翻页功能,条条⼤路通罗马,适合⾃⼰的就是最好的。代码⽰例def getUrl(self):i = 0while i < 271:url = ('/people/81099629/collect?start='+str(i)+'&sort=time&rating=all&filter=all&mode=grid')Page(url)i += 154. 数据存储数据存储有很多种⽅法,因为数据量不⼤,⽤Excel即可满⾜,具体⽅法就不在这⾥赘述了。代码⽰例def __init__(self):self.f = ok() # 创建⼯作薄1 = _sheet(u'央之姑娘', cell_overwrite_ok=True) # 命名tle = [u'编号',u'书名', u'信息', u'读过⽇期', u'评论'] # 创建标题for i in range(0, len(tle)):# 最后⼀个参数设置样式(0, i, tle[i], _style('Times new Roman', 220, True))# Excel保存位置('C://Users//DELL//央之姑娘.xlsx')def set_style(self, name, height, bold=False):style = e() # 初始化样式font = () # 为样式创建字体 = = _index = = = fontreturn style三、效果演⽰前⾯讲了爬⾍的原理和⽅法,那么接下来我们就展⽰⼀下具体效果:以上就是本次分享的主要内容,因为是第⼀次爬⾍,有借鉴前⼈经验,且尚有优化空间。如果您有更好的⽅法欢迎交流探讨,如果您觉得内容还可以也欢迎转发推荐哦。⼈⽣苦短,等你来玩ing~附录:完整代码from lxml import etreeimport requestsimport xlwtimport xlrdclass douban(object):def __init__(self):self.f = ok() # 创建⼯作薄1 = _sheet(u'央之姑娘', cell_overwrite_ok=True) # 命名tle = [u'编号',u'书名', u'信息', u'读过⽇期', u'评论'] # 创建标题for i in range(0, len(tle)):# 最后⼀个参数设置样式(0, i, tle[i], _style('Times new Roman', 220, True))# Excel保存位置('C://Users//DELL//央之姑娘.xlsx')def set_style(self, name, height, bold=False):style = e() # 初始化样式font = () # 为样式创建字体 = = _index = = = fontreturn styledef getUrl(self):#⾃动翻页'''url = ('/people/81099629/collect?start=0&sort=time&rating=all&filter=all&mode=grid')Page(url)'''i = 0while i < 271:url = ('/people/81099629/collect?start='+str(i)+'&sort=time&rating=all&filter=all&mode=grid')Page(url)i += 15def spiderPage(self,url):if url is None:return Nonetry:data=_workbook('C://Users//DELL//央之姑娘.xlsx')table=()[0]rowCount=#获取⾏数# 1. 创建session对象,可以保存Cookie值ssion = n()# 2. 处理 headersuser_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'headers={'User-Agent':user_agent}# 3. 需要登录的⽤户名和密码data = {"email":"⾖瓣账户名XX", "password":"⾖瓣密码XX"}# 4. 发送附带⽤户名和密码的请求,并获取登录后的Cookie值,保存在ssion⾥("/accounts/login", data = data)respon=(url,headers=headers)htmltext= = (htmltext)trs = ('//*[@id="content"]/div[2]/div[1]')m=0for tr in trs:i = 1while i <= 15:data = []title = ("./ul/li["+str(i)+"]/div[2]/h2/a/text()")info = ('./ul/li['+str(i)+']/div[2]/div[1]/text()')date = ('./ul/li['+str(i)+']/div[2]/div[2]/div[1]/span[2]/text()')comment = ('./ul/li['+str(i)+']/div[2]/div[2]/p/text()')title=title[0] if title else ''info=info[0] if info else ''date=date[0] if date else ''comment=comment[0] if comment else ''(rowCount+m)(title)(info)(date)(comment)i += 1for n in range(len(data)):(rowCount+m,n,data[n])m+=1print(m)print(title, info, date, comment)finally:('C://Users//DELL//央之姑娘.xlsx')if '_main_':qn=douban()()

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1687982058a63461.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信