引言:今天周末,想找本电子书看看。发现了一个很好的电子书下载网站。为了以后找书方便,顺便练习一下python3写爬虫,于是就有了今天的小成果,python3爬取电子书网站所有链接。

第一步:网站分析

点击网站的尾页,看看总共有多少网页。如下图:

点击链接,进入任意子页面,要爬取下面的5个框框。

2.开始写代码

先获取每个父页面所有书名链接。

取得页面结构。

根据以上分析,先写代码,拼接出所有的父页面。

if __name__ == "__main__":

try:

pool = multiprocessing.Pool(processes=8)

for i in range(1, 219):

url = "http://www.ireadweek.com/index.php/index/" + str(i)+".html"#这里就是所有父页面

pool.apply_async(get_index_url, args=(url,))  # 维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去

pool.close()

pool.join()  # 调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束

except:

print(‘abort‘)

然后,获取某一父页面中所有书名链接:

wbdata = requests.get(url, headers=header).content

soup = BeautifulSoup(wbdata, ‘html.parser‘)

links = soup.select(‘html > body > div > div > ul > a‘) #这个是由上面copy selector得到的

然后,拼接子页面来获取子页面的网页内容:

book_page_url = "http://www.ireadweek.com"+page_url

wbdata2 = requests.get(book_page_url, headers=header).content.decode(‘utf-8‘)

soup2 = BeautifulSoup(wbdata2, ‘html.parser‘)

再,在子页面中获取上面的5个框框里面的信息,方法也是如上,书名上鼠标右键->审查元素,得到下图:

于是,得到这样的结构分支:

body > div > div > div.hanghang - za > div: nth - child(1)

#用beautifulsoup的select来获取。注意这里要在前面加上html。获取情况需要加print打印来调试

book_name = soup2.select(‘html > body > div > div > div.hanghang-za > div.hanghang-za-title‘)[0].text

print(book_name)

通过同样的方式,将其他信息获取。

dowrload_url = soup2.select(‘html > body > div > div > div.hanghang-za > div.hanghang-box > div.hanghang-shu-content-btn > a‘)[0].get(‘href‘)

print(dowrload_url)

# body > div > div > div.hanghang - za > div.hanghang - shu - content > div.hanghang - shu - content - font > p: nth - child(1)

author = soup2.select(‘html > body > div > div > div.hanghang-za > div.hanghang-shu-content > div.hanghang-shu-content-font > p‘)[0].text

print(author)

category = soup2.select(‘html > body > div > div > div.hanghang-za > div.hanghang-shu-content > div.hanghang-shu-content-font > p‘)[1].text

print(category)

book_info = soup2.select(‘html > body > div > div > div.hanghang-za > div.hanghang-shu-content > div.hanghang-shu-content-font > p‘)[4].text

print(book_info)

# body > div > div > div.hanghang - za > div: nth - child(1)

book_name = soup2.select(‘html > body > div > div > div.hanghang-za > div.hanghang-za-title‘)[0].text

print(book_name)

终端打印如下:

3.遇到的问题:

1)如何提取类似下面这样内容里面的网址链接?

ZZZ

解决:如下,

book_name = soup2.select(‘html > body > div > div > div.hanghang-za > div.hanghang-box > div.hanghang-shu-content-btn > a‘)[0].get(‘href‘)

2)如下写法会报错。

soup= BeautifulSoup(html_cont,‘html.parser‘,from_encoding=‘utf-8‘)

报错:UserWarning: Youprovided Unicode markup but also provided a value for from_encoding. Yourfrom_encoding will be ignored.

解决方法: 删除【from_encoding="utf-8"】

原因:python3 缺省的编码是unicode, 再在from_encoding设置为utf8, 会被忽视掉,去掉【from_encoding="utf-8"】这一个好了 。

3)写入csv文件后,用notepad打开正常显示,用Excel打开是乱码。如下

解决:代码中打开方式这样写:

with open("C:/BookDownload.csv",‘a‘,encoding=‘utf-8‘,newline=‘‘) as f:#这句会乱码

with open("C:/BookDownload.csv",‘a‘,encoding=‘gb18030‘,newline=‘‘) as f:  #这句解决对策

好啦,解决了以上问题,终于可以爬取了。如果觉得有帮助的话,请支持一下。

下面上完整代码:

#!/usr/bin/env python3

# -*- coding: utf-8

#author:wangqiyang

import re

import pymysql

import csv

import time

import requests

import multiprocessing

import random

import codecs

from bs4 import BeautifulSoup

#假装不同的浏览器,这次暂时没有用上。

user_agent_list = [

"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",

"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",

"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",

"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",

"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",

‘Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; InfoPath.2; .NET CLR 3.5.30729; .NET CLR 3.0.30618; .NET CLR 1.1.4322)‘,

]

#这个实际不用写这么多,为了防止被封,就多写点吧

header = {

‘User-Agent‘: "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",#user_agent_list[random.randint(0, 5)],

‘Connection‘: ‘keep-alive‘,

‘Cookie‘: ‘这里粘贴自己cookie‘,

‘Host‘: ‘www.ireadweek.com‘,

‘Referer‘: ‘http://www.ireadweek.com/index.php/Index/index.html‘,

‘Upgrade-Insecure-Requests‘: ‘1‘

}

def get_index_url(url):

wbdata = requests.get(url, headers=header).content

soup = BeautifulSoup(wbdata, ‘html.parser‘)

links = soup.select(‘html > body > div > div > ul > a‘)

for link in links:

try:

time.sleep(random.randint(1,3))

page_url = link.get(‘href‘)

print("page_url:"+"http://www.ireadweek.com"+page_url)

book_page_url = "http://www.ireadweek.com"+page_url

wbdata2 = requests.get(book_page_url, headers=header).content.decode(‘utf-8‘)

# print(wbdata2)

soup2 = BeautifulSoup(wbdata2, ‘html.parser‘)

dowrload_url = "NONE"

dowrload_url = soup2.select(‘html > body > div > div > div.hanghang-za > div.hanghang-box > div.hanghang-shu-content-btn > a‘)[0].get(‘href‘)

print(dowrload_url)

# body > div > div > div.hanghang - za > div.hanghang - shu - content > div.hanghang - shu - content - font > p: nth - child(1)

author = soup2.select(‘html > body > div > div > div.hanghang-za > div.hanghang-shu-content > div.hanghang-shu-content-font > p‘)[0].text

print(author)

category = soup2.select(‘html > body > div > div > div.hanghang-za > div.hanghang-shu-content > div.hanghang-shu-content-font > p‘)[1].text

print(category)

book_info = soup2.select(‘html > body > div > div > div.hanghang-za > div.hanghang-shu-content > div.hanghang-shu-content-font > p‘)[4].text

print(book_info)

# body > div > div > div.hanghang - za > div: nth - child(1)

book_name = soup2.select(‘html > body > div > div > div.hanghang-za > div.hanghang-za-title‘)[0].text

print(book_name)

with open("C:/BookDownload.csv",‘a‘,encoding=‘gb18030‘,newline=‘‘) as f:

try:

# f.write(codecs.BOM_UTF8)

f.write(book_name)

f.write(‘,‘)

f.write(author)

f.write(‘,‘)

f.write(category)

f.write(‘,‘)

f.write(dowrload_url)

f.write(‘,‘)

f.write("\n")

except:

pass

except:

print("link not found!!!"+link)

pass

if __name__ == "__main__":

try:

pool = multiprocessing.Pool(processes=8)

print("---------------------1---------------")

for i in range(1, 219):

url = "http://www.ireadweek.com/index.php/index/" + str(i)+".html"

print("---------------------2---------------"+url)

pool.apply_async(get_index_url, args=(url,))  # 维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去

pool.close()

pool.join()  # 调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束

except:

print(‘abort‘)

使用python爬取电子书_怎样用python3爬取电子书网站所有下载链接相关推荐

  1. Python 多线程、利用request使用代理、利用递归深度抓取电影网页的内容并将电影的介绍和下载链接保存到mysql中

    本文仅为学习python过程的一个笔记,其中还有一些bug! 还请各位大佬赐教 有些专业的说法还不是很熟悉,欢迎各位大佬帮忙指出 本人时一个新晋奶爸,而立之年突然想转业,想学习python 先介绍一个 ...

  2. python爬虫下载链接_【Python项目】简单爬虫批量获取资源网站的下载链接

    简单爬虫批量获取资源网站的下载链接 1 由来 自己在收集剧集资源的时候,这些网站的下载链接还要手动一个一个复制到百度云离线下载里,稍微懂了一点编程就不想做这种无意义的劳动了.于是就写了一个这样的一个小 ...

  3. python数据爬虫课程_数据分析之Python3爬虫视频课程

    第1章 python网络爬虫牛刀小试 1小时38分钟11节 1-1 编写第一个只网络爬虫1.使用requests模拟浏览器访问网址 2.使用美丽汤BeautifulSoup解析网页 3.提取出新闻的标 ...

  4. mobi格式电子书_进阶能力 | 了解常见的电子书格式

    静读君是初中开始接触电子书的,那个时候以为电子书就是TXT,到后来渐渐地接触到了PDF.DOC.CAJ ······ 才知道原来电子书还分这么多的格式,那个时候还在想,为什么要弄这么多不同的格式呢?那 ...

  5. python爬虫excel数据_最简单的爬数据方法:Excel爬取数据,仅需6步

    原标题:最简单的爬数据方法:Excel爬取数据,仅需6步 在看到这篇文章的时候,大家是不是都还停留在对python爬虫的迷恋中,今天就来教大家怎样使用微软的Excel爬取一个网页的后台数据,注:此方法 ...

  6. python selenium爬虫豆瓣_使用selenium+requests爬取豆瓣小组讨论列表

    获取本文代码 · 我的GitHub 注:这个项目的代码会在我的GitHub持续优化.更新,而在本文中的代码则是最初版本的代码. 豆瓣小组 豆瓣有一个"小组"模块,有一些小组中会发布 ...

  7. python爬虫好友图片_用itchat库爬取你所有微信好友的头像,并合成一张大图

    几年前,我们给爸妈手机上下载了一款神奇的软件,他的名字叫微信.几年后,爸妈就开始吐槽我们的微信头像了. 爸妈对我们微信头像的关注程度远胜过我们的衣食住行,我在新浪微博上看到了这张统计图. 图片来源:新 ...

  8. python爬虫爬取豆瓣_爬虫,从爬取豆瓣开始

    1 爬虫概述 当初第一次接触python,听的最多的就是爬虫爬虫,搞得我一脸蒙蔽,因为我从来都没听过这么新颖的词,而且我还天真的以为是不是python长得像一条小虫子,所以才叫爬虫. 直到后来经过不断 ...

  9. python爬取天天基金_分享天天基金数据爬取的Python脚本

    0 luckzpz - 像爱惜自己生命一样保护本金 赞同来自: 学习Python 2020-09-08 22:24 0 条评论 0 luckzpz - 像爱惜自己生命一样保护本金 赞同来自: 似乎文件 ...

  10. python爬取抖音评论_怎样用Python3爬取抖音神曲

    1 这里我给大家代码吧!1 def get_video_urls(self, user_id): 2 3 + video_names = [] 4 + video_urls = [] 5 + uniq ...

最新文章

  1. Spring bean 实现生命周期的三种解决方案
  2. C段渗透攻击必看的技术知识
  3. Android 中单选框或复选框点击其中一个,其余取消操作
  4. c++类与类的依赖(Dependency)关系
  5. php预处理器,【 PHP 】PHP(超文本预处理器)新版下载 - U大师
  6. 陌生的是人心,是人性,是社会,是世道
  7. MapReduce分区-原理
  8. nodejs_NodeJS历险记
  9. Android AlarmManager实现不间断轮询服务
  10. 属于哪个单元_1~6年级上册数学第一单元知识整理
  11. ARP协议以及攻击欺骗和防御
  12. idea新建web项目并配置运行教程
  13. Java基础教程【第四章:Java流程控制】
  14. 《社交网站界面设计(原书第2版)》——3.6 指纹或Bio指纹
  15. 能力提升综合题单 Part 8.3.3 最近公共祖先
  16. android webview权限申请_android中使用WebView请求网页
  17. MAC OS读取NTFS格式硬盘
  18. github添加设置ssh key
  19. stm32F407控制器在驱动电机等执行机构时,ADS1256采集模块出现死机现象,问题待解决
  20. html实现iphone桌面,HTML_Html5实现iPhone开机界面示例代码,今天我突发其想,想到可以用H - phpStudy...

热门文章

  1. 【内核调度、负载均衡】【find_busiest_group】
  2. PBR流程介绍和模型规范
  3. 京东618自动浏览叠蛋糕app
  4. QTP自动化测试培训大纲
  5. java 验证手机号
  6. linux给目录分配空间,Linux 分配/home的磁盘空间给根目录
  7. python3思维导图.xmind_Xmind和FreeMind思维导图格式互转
  8. ssdt函数索引号_获得SSDT函数名和索引号的代码
  9. matlab的setup阶跃曲线图,matlab 绘制系统的单位阶跃响应曲线 并编写程序求峰值时间 超调量 | 学步园...
  10. google 文档翻译 html,快速将整篇中文文档翻译成全英文(史上最全总结)