爬虫1:Requests+Xpath 爬取豆瓣电影TOP
【抓取】:参考前文 爬虫系列1:
【分页】:参考前文 爬虫系列2:
【保存】:参考前文 爬虫系列3:
【动态】:参考前文 爬虫系列4:
1 电影名称
# 1 Requests+Xpath 菜鸟爬取豆瓣TOP # 电影名称'''Requests+Xpath 爬取豆瓣电影安装 Python 应用包pip install requestspip install lxml获取元素的Xpath信息并获得文本:手动获取:定位目标元素,在网站上依次点击:右键 > 检查file=s.xpath('元素的Xpath信息/text()') 快捷键“shift+ctrl+c”,移动鼠标到对应的元素时即可看到对应网页代码:在电影标题对应的代码上依次点击 右键 > Copy > Copy XPath,获取电影名称的Xpath:'''import requests from lxml import etreeurl = 'https://book.douban.com/top250'data = requests.get(url).texts=etree.HTML(data)film=s.xpath('//*[@id="content"]/div/div[1]/div/table[1]/tr/td[2]/div[1]/a/@title')print(film)# 打印:['追风筝的人']
2 全部书名
# 2 全部书名'''浏览器经常会自己在里面增加多余的 tbody 标签,我们需要手动把这些标签删掉。分别复制《追风筝的人》、《小王子》、《围城》、《解忧杂货店》的 xpath 信息进行对比://*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div[1]/a//*[@id="content"]/div/div[1]/div/table[2]/tbody/tr/td[2]/div[1]/a//*[@id="content"]/div/div[1]/div/table[3]/tbody/tr/td[2]/div[1]/a//*[@id="content"]/div/div[1]/div/table[4]/tbody/tr/td[2]/div[1]/a比较可以发现书名的 xpath 信息仅仅 table 后的序号不一样,并且跟书的序号一致,于是去掉序号(去掉 tbody),我们可以得到通用的 xpath 信息://*[@id=“content”]/div/div[1]/div/table/tr/td[2]/div[1]/a'''import requests from lxml import etreeurl = 'https://book.douban.com/top250'data = requests.get(url).texts=etree.HTML(data)file=s.xpath('//*[@id="content"]/div/div[1]/div/table/tr/td[2]/div[1]/a/@title')for title in file: print(title)# 打印:追风筝的人解忧杂货店小王子白夜行围城挪威的森林三体嫌疑人X的献身活着红楼梦百年孤独不能承受的生命之轻看见达·芬奇密码平凡的世界(全三部)三体Ⅱ三体Ⅲ简爱(英文全本)哈利·波特与魔法石天才在左 疯子在右送你一颗子弹傲慢与偏见我们仨飘倾城之恋
3 爬取页面多个信息时的数据准确匹配问题
# 3 爬取页面多个信息时的数据准确匹配问题# strip(“(”) 表示删除括号, strip() 表示删除空白符。'''问题:我们默认书名和评分是正确的信息,如果某一项少爬或多爬了信息,匹配错误思路:书名的标签肯定在这本书的框架内,以每本书为单位,分别取获取对应的信息,完全匹配//*[@id=“content”]/div/div[1]/div/table[1] #整本书//*[@id=“content”]/div/div[1]/div/table[1]/tr/td[2]/div[1]/a #书名//*[@id=“content”]/div/div[1]/div/table[1]/tr/td[2]/div[2]/span[2] #评分我们发现,书名和评分 xpath 的前半部分和整本书的 xpath 一致的, 那我们可以通过这样写 xpath 的方式来定位信息:file=s.xpath(“//*[@id=“content”]/div/div[1]/div/table[1]”)title =div.xpath(“./tr/td[2]/div[1]/a/@title”)score=div.xpath(“./tr/td[2]/div[2]/span[2]/text()”)'''import requests import timefrom lxml import etreeurl = 'https://book.douban.com/top250'data = requests.get(url).texts=etree.HTML(data)file=s.xpath('//*[@id="content"]/div/div[1]/div/table')for div in file: title = div.xpath("./tr/td[2]/div[1]/a/@title")[0] href = div.xpath("./tr/td[2]/div[1]/a/@href")[0] score = div.xpath("./tr/td[2]/div[2]/span[2]/text()")[0] num = div.xpath("./tr/td[2]/div[2]/span[3]/text()")[0].strip("(").strip().strip(")") scribe = div.xpath("./tr/td[2]/p[2]/span/text()") time.sleep(2) print("{}{}{}{}{}".format(title,href,score,num,scribe[0]))# 打印:追风筝的人https://book.douban.com/subject/1770782/8.9327174人评价 为你,千千万万遍解忧杂货店https://book.douban.com/subject/25862578/8.6298863人评价 一碗精心熬制的东野牌鸡汤,拒绝很难小王子https://book.douban.com/subject/1084336/9.0252153人评价 献给长成了大人的孩子们
4 翻页
# 4翻页'''https://book.douban.com/top250?start=0 #第一页https://book.douban.com/top250?start=25 #第二页https://book.douban.com/top250?start=50 #第三页以每页25为单位,递增25,只是 start=()的数字不一样写一个循环for a in range(3): url = 'https://book.douban.com/top250?start={}'.format(a*25) #3个页面,用 a*25 保证以25为单位递增 '''import requests import time from lxml import etreefor a in range(3): url = 'https://book.douban.com/top250?start={}'.format(a*25) data = requests.get(url).text s=etree.HTML(data) file=s.xpath('//*[@id="content"]/div/div[1]/div/table') time.sleep(3) for div in file: title = div.xpath("./tr/td[2]/div[1]/a/@title")[0] href = div.xpath("./tr/td[2]/div[1]/a/@href")[0] score=div.xpath("./tr/td[2]/div[2]/span[2]/text()")[0] num=div.xpath("./tr/td[2]/div[2]/span[3]/text()")[0].strip("(").strip().strip(")").strip() scrible=div.xpath("./tr/td[2]/p[2]/span/text()") if len(scrible) > 0: print("{},{},{},{},{}\n".format(title,href,score,num,scrible[0])) else: print("{},{},{},{}\n".format(title,href,score,num))# 打印:追风筝的人,https://book.douban.com/subject/1770782/,8.9,327193人评价,为你,千千万万遍解忧杂货店,https://book.douban.com/subject/25862578/,8.6,298891人评价,一碗精心熬制的东野牌鸡汤,拒绝很难小王子,https://book.douban.com/subject/1084336/,9.0,252173人评价,献给长成了大人的孩子们
readme.txt
公众号:一只阿木木