2017.08.17 Python爬虫实战之BS4获取起点小说信息

1.目标分析:

(1)打开起点中文网,搜索所有完本小说:

原始的网址是这样的:http://a.qidian.com/?action=1&orderId=&page=1&style=1&pageSize=2&siteid=4&hiddenField=3

界面是这样的:

修改网址中的参数,观察不同效果:

再修改参数style试试:

(2)查看页面源代码:

2.项目实施:

(1)创建远程数据库以及表:

CREATE TABLE `qiDianBooks` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`categoryName` CHAR(20) NOT NULL,
`bookName` CHAR(20) NOT NULL,
`wordsNum` CHAR(10) NOT NULL,
`updateTime` CHAR(20) NOT NULL,
`authorName` CHAR(20) NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB;

(2)编写把数据保存到远程mysql数据库的文件:save2mysql.py

#! /usr/bin/env python#-*- coding:utf-8 -*-

import MySQLdb

class SavebookData(object):    def __init__(self,items):        self.host=‘*********‘        self.port=3306        self.user=‘crawlUSER‘        self.passwd=‘*******‘        self.db=‘bs4DB‘        self.run(items)

def run(self,items):        conn=MySQLdb.connect(host=self.host,port=self.port,user=self.user,passwd=self.passwd,db=self.db,charset=‘utf8‘)        cur=conn.cursor()        print(u‘连接成功‘)        for item in items:            cur.execute("INSERT INTO qiDianBooks(categoryName,bookName,wordsNum,updateTime,authorName)  VALUES (%s,%s,%s,%s,%s)",                        (item.categoryName.encode(‘utf8‘),item.bookName.encode(‘utf8‘),item.wordsNum.encode(‘utf8‘),item.updateTime.encode(‘utf8‘),item.authorName.encode(‘utf8‘)))        cur.close()        conn.commit()        conn.close()

if __name__ == ‘__main__‘:    pass

(3)编写主程序文件completeBook.py文件:

#! /usr/bin/env python#-*- coding:utf-8 -*-

from bs4 import BeautifulSoupimport urllib2import reimport codecsimport timefrom mylog import MyLog as mylogfrom save2mysql import SavebookData

class BookItem(object):    categoryName=None  #小时类型    middleUrl=None    bookName=None  #小说名    wordsNum=None  #总字数    updateTime=None  #更新时间    authorName=None  #作者

class GetBookName(object):    def __init__(self):        self.urlBase=‘http://a.qidian.com/?action=1&orderId=&style=2&page=1‘        self.log=mylog()        self.pages=self.getPages(self.urlBase)        self.booksList=[]        self.spider(self.urlBase,self.pages)        self.pipelines(self.booksList)        self.log.info(‘begin save data to mysql \r\n‘)        SavebookData(self.booksList)        self.log.info(‘save data to mysql end......\r\n‘)

def getPages(self,url):        htmlContent=self.getResponseContent(url)

soup=BeautifulSoup(htmlContent,‘lxml‘)        tags=soup.find(‘ul‘,attrs={‘class‘:‘lbf-pagination-item-list‘})        strUrl=tags.find_all(‘a‘)[-2].get(‘href‘)        self.log.info(strUrl)        self.log.info(strUrl.split(‘&‘))        for st in strUrl.split(‘&‘):            self.log.info(st)            if re.search(‘page=‘,st):                pages=st.split(‘=‘)[-1]                self.log.info(u‘获取页数为:%s‘ %pages)                return int(pages)

def getResponseContent(self,url):        try:             response=urllib2.urlopen(url.encode(‘utf8‘))        except:             self.log.error(u‘python 返回 URL:%s 数据失败‘ %url)        else:             self.log.info(u‘Python 返回URL:%s A数据成功‘ %url)             return response.read()

def spider(self,url,pages):        urlList=url.split(‘=‘)

self.log.info(urlList)        for i in xrange(1,pages+1):            urlList[-1]=str(i)            newUrl=‘=‘.join(urlList)            self.log.info(newUrl)            htmlContent=self.getResponseContent(newUrl)            soup=BeautifulSoup(htmlContent,‘lxml‘)            tags=soup.find(‘div‘,attrs={‘class‘:‘main-content-wrap fl‘}).find(‘div‘,attrs={‘class‘:‘all-book-list‘}).find(‘tbody‘).find_all(‘tr‘)            self.log.info(tags[0])

for tag in tags:                tds=tag.find_all(‘td‘)                self.log.info(tds)

item=BookItem()                item.categoryName=tds[0].find(‘a‘,attrs={‘class‘:‘type‘}).get_text()+tds[0].find(‘a‘,attrs={‘class‘:‘go-sub-type‘}).get_text()                item.middleUrl=tds[0].find(‘a‘,attrs={‘class‘:‘type‘}).get(‘href‘)                item.bookName=tds[1].find(‘a‘,attrs={‘class‘:‘name‘}).get_text()

item.wordsNum=tds[3].find(‘span‘,attrs={‘class‘:‘total‘}).get_text()                item.updateTime=tds[5].get_text()                item.authorName=tds[4].find(‘a‘,attrs={‘class‘:‘author‘}).get_text()                self.log.info(item.categoryName)                self.booksList.append(item)                self.log.info(u‘获取书名为<<%s>>的数据成功‘ %item.bookName)

def pipelines(self,bookList):        bookName=u‘起点中文网完本小说.txt‘.encode(‘GBK‘)        nowTime=time.strftime(‘%Y-%m-%d %H:%M:%S \r\n‘,time.localtime())        with codecs.open(bookName,‘w‘,‘utf8‘) as fp:            fp.write(‘run time :%s‘ %nowTime)            for item in self.booksList:                fp.write(‘%s \t %s \t\t %s \t %s \t %s \r\n‘ %(item.categoryName,item.bookName,item.wordsNum,item.updateTime,item.authorName))

self.log.info(u‘将书名为<<%s>>的数据存入"%s".....‘ %(item.bookName,bookName.decode(‘GBK‘)))

if __name__ == ‘__main__‘:    GBN=GetBookName()

(4)运行结果:数据库保存的数据

文本保存的数据:

				
时间: 2024-08-28 10:30:09

2017.08.17 Python爬虫实战之BS4获取起点小说信息的相关文章

2017.08.10 Python爬虫实战之爬虫攻防篇

1.封锁user-agent破解: user-agent是浏览器的身份标识,网站就是通过user-agent来确定浏览器类型的.有很多网站会拒绝不符合一定标准的user-agent请求网页,如果网站将频繁访问网站的user-agent作为爬虫的标志,然后加入黑名单该怎么办? (1)首先在meiju项目下,settings.py的同级目录创建middlewares目录,进入middlewares目录,创建__init__.py,将middlewares目录变成一个Python模块 (2)创建资源文

2017.08.10 Python爬虫实战之爬虫攻防

1.创建一般的爬虫:一般来说,小于100次访问的爬虫都无须为此担心 (1)以爬取美剧天堂为例,来源网页:http://www.meijutt.com/new100.html,项目准备: scrapy startproject meiju100 F:\Python\PythonWebScraping\PythonScrapyProject>cd meiju100 F:\Python\PythonWebScraping\PythonScrapyProject\meiju100>scrapy gen

python爬虫实战(一)----------爬取京东商品信息

本文章的例子仅用于学习之用,如涉及版权隐私信息,请联系本人删除,谢谢. 最近一直在练习使用python爬取不同网站的信息,最终目的是实现一个分布式的网络爬虫框架,可以灵活适用不同的爬取需求. 项目github地址: https://github.com/happyAnger6/anger6Spider 在学习的过程中遇到不少问题,在这里做一下总结,并分享出来,希望有兴趣的朋友批评指正,共同学习共同进步. 本着实用至上的目的,不准备过多讲实现细节和原理,直接通过项目需求来边实战边学习,因此本系列文

Python爬虫实战七之计算大学本学期绩点

大家好,本次为大家带来的项目是计算大学本学期绩点.首先说明的是,博主来自山东大学,有属于个人的学生成绩管理系统,需要学号密码才可以登录,不过可能广大读者没有这个学号密码,不能实际进行操作,所以最主要的还是获取它的原理.最主要的是了解cookie的相关操作. 本篇目标 1.模拟登录学生成绩管理系统 2.抓取本学期成绩界面 3.计算打印本学期成绩 1.URL的获取 恩,博主来自山东大学~ 先贴一个URL,让大家知道我们学校学生信息系统的网站构架,主页是 http://jwxt.sdu.edu.cn:

Python爬虫实战四之抓取淘宝MM照片

福利啊福利,本次为大家带来的项目是抓取淘宝MM照片并保存起来,大家有没有很激动呢? 最新动态 更新时间:2015/8/2 最近好多读者反映代码已经不能用了,原因是淘宝索引页的MM链接改了.网站改版了,URL的索引已经和之前的不一样了,之前可以直接跳转到每个MM的个性域名,现在中间加了一个跳转页,本以为可以通过这个页面然后跳转到原来的个性域名,而经过一番折腾发现,这个跳转页中的内容是JS动态生成的,所以不能用Urllib库来直接抓取了,本篇就只提供学习思路,代码不能继续用了. 之后博主会利用其它方

Python爬虫实战二之爬取百度贴吧帖子

大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不好使,八成是正则表达式那儿匹配不到了,请更改一下正则,当然最主要的还是帮助大家理解思路. 2016/12/2 本篇目标 1.对百度贴吧的任意帖子进行抓取 2.指定是否只抓取楼主发帖内容 3.将抓取到的内容分析并保存到文件 1.URL格式的确定 首先,我们先观察一下百度贴吧的任意一个帖子. 比如:ht

Python爬虫实战---抓取图书馆借阅信息

原创作品,引用请表明出处:Python爬虫实战---抓取图书馆借阅信息 前段时间在图书馆借了很多书,借得多了就容易忘记每本书的应还日期,老是担心自己会违约,影响日后借书,而自己又懒得总是登录到学校图书馆借阅系统查看,于是就打算写一个爬虫来抓取自己的借阅信息,把每本书的应还日期给爬下来,并写入txt文件,这样每次忘了就可以打开该txt文件查看,每次借阅信息改变了,只要再重新运行一遍该程序,原txt文件就会被新文件覆盖,里面的内容得到更新. 用到的技术: Python版本是 2.7 ,同时用到了ur

Python爬虫实战(2):爬取京东商品列表

1,引言 在上一篇<Python爬虫实战:爬取Drupal论坛帖子列表>,爬取了一个用Drupal做的论坛,是静态页面,抓取比较容易,即使直接解析html源文件都可以抓取到需要的内容.相反,JavaScript实现的动态网页内容,无法从html源代码抓取需要的内容,必须先执行JavaScript. 我们在<Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容>一文已经成功检验了动态网页内容的抓取方法,本文将实验程序进行改写,使用开源Python爬虫

Python实战:Python爬虫学习教程,获取电影排行榜

Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习Python这门语言. 本文是在前一部分Python基础之上程序员带你十天快速入门Python,玩转电脑软件开发(四),再次进行的Python爬虫实战课程. 正则表达式实例简单详解 正则表达式干什么用? 就是在字符串中提取我们需要的内容的. 记得哦,要先引用正则表达式模块的哦. re就是正则表达式相