您的位置:首页 > 脚本大全 > > 正文

python爬虫第一本书(我用Python抓取了7000 多本电子书案例详解)

更多 时间:2021-11-03 15:06:27 类别:脚本大全 浏览量:1252

python爬虫第一本书

我用Python抓取了7000 多本电子书案例详解

安装

安装很简单,只要执行:

  • ?
  • 1
  • pip install requests-html
  • 就可以了。

    分析页面结构

    通过浏览器审查元素可以发现这个电子书网站是用 wordpress 搭建的,首页列表元素很简单,很规整

    python爬虫第一本书(我用Python抓取了7000 多本电子书案例详解)

    所以我们可以查找 .entry-title > a 获取所有图书详情页的链接,接着我们进入详情页,来寻找下载链接,由下图

    python爬虫第一本书(我用Python抓取了7000 多本电子书案例详解)

    可以发现 .download-links > a 里的链接就是该书的下载链接,回到列表页可以发现该站一共 700 多页,由此我们便可以循环列表获取所有的下载链接。

    requests-html 快速指南

    发送一个 get 请求:

  • ?
  • 1
  • 2
  • 3
  • 4
  • from requests_html import htmlsession
  • session = htmlsession()
  •  
  • r = session.get('https://python.org/')
  • requests-html 的方便之处就是它解析 html 方式就像使用 jquery 一样简单,比如:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • # 获取页面的所有链接可以这样写:
  • r.html.links
  • # 会返回 {'//docs.python.org/3/tutorial/', '/about/apps/'}
  •  
  • # 获取页面的所有的绝对链接:
  • r.html.absolute_links
  • # 会返回 {'https://github.com/python/pythondotorg/issues', 'https://docs.python.org/3/tutorial/'}
  •  
  • # 通过 css 选择器选择元素:
  • about = r.find('.about', first=true)
  • # 参数 first 表示只获取找到的第一元素
  • about.text # 获取 .about 下的所有文本
  • about.attrs # 获取 .about 下所有属性像 id, src, href 等等
  • about.html # 获取 .about 的 html
  • about.find('a') # 获取 .about 下的所有 a 标签
  • 构建代码

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • from requests_html import htmlsession
  • import requests
  • import time
  • import json
  • import random
  • import sys
  •  
  • '''
  • 想要学习python?python学习交流群:984632579满足你的需求,资料都已经上传群文件,可以自行下载!
  • '''
  •  
  • session = htmlsession()
  • list_url = 'http://www.allitebooks.com/page/'
  •  
  • user_agents = [
  •   "mozilla/5.0 (macintosh; intel mac os x 10_7_3) applewebkit/535.20 (khtml, like gecko) chrome/19.0.1036.7 safari/535.20",
  •   "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.1 (khtml, like gecko) chrome/21.0.1180.71 safari/537.1 lbbrowser",
  •   "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/535.11 (khtml, like gecko) chrome/17.0.963.84 safari/535.11 lbbrowser",
  •   "mozilla/4.0 (compatible; msie 7.0; windows nt 6.1; wow64; trident/5.0; slcc2; .net clr 2.0.50727; .net clr 3.5.30729; .net clr 3.0.30729; media center pc 6.0; .net4.0c; .net4.0e)",
  •   "mozilla/4.0 (compatible; msie 6.0; windows nt 5.1; sv1; qqdownload 732; .net4.0c; .net4.0e)",
  •   "mozilla/4.0 (compatible; msie 7.0; windows nt 5.1; trident/4.0; sv1; qqdownload 732; .net4.0c; .net4.0e; 360se)",
  •   "mozilla/4.0 (compatible; msie 6.0; windows nt 5.1; sv1; qqdownload 732; .net4.0c; .net4.0e)",
  •   "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.1 (khtml, like gecko) chrome/21.0.1180.89 safari/537.1",
  •   "mozilla/5.0 (ipad; u; cpu os 4_2_1 like mac os x; zh-cn) applewebkit/533.17.9 (khtml, like gecko) version/5.0.2 mobile/8c148 safari/6533.18.5",
  •   "mozilla/5.0 (windows nt 6.1; win64; x64; rv:2.0b13pre) gecko/20110307 firefox/4.0b13pre",
  •   "mozilla/5.0 (x11; ubuntu; linux x86_64; rv:16.0) gecko/20100101 firefox/16.0",
  •   "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.11 (khtml, like gecko) chrome/23.0.1271.64 safari/537.11",
  •   "mozilla/5.0 (x11; u; linux x86_64; zh-cn; rv:1.9.2.10) gecko/20100922 ubuntu/10.10 (maverick) firefox/3.6.10"
  • ]
  •  
  • # 获取当前列表页所有图书链接
  • def get_list(url):
  •   response = session.get(url)
  •   all_link = response.html.find('.entry-title a') # 获取页面所有图书详情链接
  •   for link in all_link:
  •     getbookurl(link.attrs['href'])
  •  
  • # 获取图书下载链接
  • def getbookurl(url):
  •   response = session.get(url)
  •   l = response.html.find('.download-links a', first=true)
  •   if l is not none: # 运行后发现有的个别页面没有下载链接,这里加个判断
  •     link = l.attrs['href'];
  •     download(link)
  •  
  • #下载图书
  • def download(url):
  •   # 随机浏览器 user-agent
  •   headers={ "user-agent":random.choice(user_agents) }
  •   # 获取文件名
  •   filename = url.split('/')[-1]
  •   # 如果 url 里包含 .pdf
  •   if ".pdf" in url:
  •     file = 'book/'+filename # 文件路径写死了,运行时当前目录必须有名 book 的文件夹
  •     with open(file, 'wb') as f:
  •       print("正在下载 %s" % filename)
  •       response = requests.get(url, stream=true, headers=headers)
  •       
  •       # 获取文件大小
  •       total_length = response.headers.get('content-length')
  •       # 如果文件大小不存在,则直接写入返回的文本
  •       if total_length is none:
  •         f.write(response.content)
  •       else:
  •         # 下载进度条
  •         dl = 0
  •         total_length = int(total_length) # 文件大小
  •         for data in response.iter_content(chunk_size=4096): # 每次响应获取 4096 字节
  •           dl += len(data)
  •           f.write(data)
  •           done = int(50 * dl / total_length)
  •           sys.stdout.write("\r[%s%s]" % ('=' * done, ' ' * (50-done)) ) # 打印进度条 
  •           sys.stdout.flush()
  •  
  •       print(filename + '下载完成!')
  •  
  • if __name__ == '__main__':
  •   #从这运行,应为知道列表总数,所以偷个懒直接开始循环
  •   for x in range(1,756):
  •     print('当前页面: '+ str(x))
  •     get_list(list_url+str(x))
  • 运行效果:

    python爬虫第一本书(我用Python抓取了7000 多本电子书案例详解)

    以上所述是小编给大家介绍的我用python抓取了7000 多本电子书案例详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对开心学习网网站的支持!

    原文链接:https://blog.csdn.net/fei347795790/article/details/88541128

    您可能感兴趣