Python爬虫的简单代码

来源:互联网 发布:android 开启网络权限 编辑:程序博客网 时间:2024/04/29 05:47

用Python爬虫的例子,网上有很多,这是自己调试的简单代码,只是记录一下,方便以后写代码的时候重复利用

爬取网络小说

       目的:由于喜欢看些网络小说,但是在网站看往往有广告或是其他东西,同时百度书名,选择网站,下载等等对我来说也是觉得相对麻烦而又浪费时间,因此想建立一个爬取网络小说的程序,用户与网站不直接接触,只是把想法告诉程序,程序自动收集网上的小说,并整理成txt文本,下载到本地手机,方便阅读。
       由于只是刚开始学习,只能调试下简单代码,实现单页文章的抓取,离目标要求还远远不够,这个主要用来练手

代码简单介绍

from urllib.request import urlopen from bs4 import BeautifulSoup import urllib.request#定义文章读取、写入函数,传入文章地址,将其写入预定文件中def read_article_XiaoShuo(article_name,article_url):#因为很多网站不能直接爬取,需要将软件伪装成浏览器,这个headers以及req就是用来伪装成浏览器的。    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/51.0.2704.63 Safari/537.36'}    req = urllib.request.Request(url=article_url, headers=headers)    html = urllib.request.urlopen(req).read()#.decode('utf8')#, 'ignore'    bsObj = BeautifulSoup(html, "lxml")     title_list=bsObj.findAll('div',attrs={'class':'bookname'})    for title in title_list:        print(title.h1.get_text())#通过对网站分析,我发现它的小说内容在<div id="content">的标签下,通过bs将其提取出来    a_list=bsObj.findAll('div',attrs={'id':'content'})#因为从网页上抓取的小说,在编码及格式上有些不满足要求,所以用正则方式进行修改    for a in a_list:        s=a.get_text()        s1=re.sub(u'(\xa0)+', '\n',s)#去掉网页编码中,不能编码的部分;#因为作者在文章开头可能会有一堆废话,不想看,所以用下面代码过滤掉。因为我找的网站上,作者的话与正文前用'---'分割,所以将'---'之前的内容全部去掉        s2=re.sub('.*--','',s1,flags=re.DOTALL)#flags=re.DOTALL表示'.'可以代表换行'\n'        print(s2)        write_file(article_name, s1)

定义一个写文件函数,每次读取的内容写入指定文章之中。
参数1:小说名称(文件保存名,没有指定路径的时候,默认在程序安装路径下)
参数2:文章内容

def write_file(file_name, s_article):#如果文件没有,将新建一个,参数'a',表示追加写入    with open(file_name, 'a',encoding='utf8') as f:        f.write(s_article)

完整代码,实现了从燃文小说网,输入小说地址,将小说下载下来的目的。

#!/usr/bin/env python3# -*- coding: utf-8 -*-from urllib.request import urlopen from bs4 import BeautifulSoup import urllib.requestimport redef write_file(file_name, s_article):    with open(file_name, 'a',encoding='utf8') as f:        f.write(s_article)  def read_article_XiaoShuo_chapter(article_title,article_url):#从章节里读取内容,写入小说文件里    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/51.0.2704.63 Safari/537.36'}    req = urllib.request.Request(url=article_url, headers=headers)    html = urllib.request.urlopen(req).read()#.decode('utf8')#, 'ignore'        bsObj = BeautifulSoup(html, "lxml")     chapter_title=bsObj.find('div',attrs={'class':'bookname'}).h1.get_text()    print(chapter_title)    write_file(article_title, '\n'+chapter_title+'\n')    a_list=bsObj.findAll('div',attrs={'id':'content'})        for a in a_list:        s=a.get_text()        s1=re.sub(u'(\xa0)+', '\n',s)        s2=re.sub('(.*--?)|(--.*--?)|(--.*)','',s1,flags=re.DOTALL)        s2=re.sub('[a-zA-Z]+?','',s2,flags=re.DOTALL)        write_file(article_title, s2+'\n')def read_article_title(article_url):    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/51.0.2704.63 Safari/537.36'}    req = urllib.request.Request(url=article_url, headers=headers)    html = urllib.request.urlopen(req).read().decode('gbk')#, 'ignore'       bsObj = BeautifulSoup(html, "lxml")     article_title=bsObj.div.h1.get_text()+'.txt'  #获得小说名字    for ch in bsObj.find('div',attrs={'id':'list'}).findAll('a',attrs={'href':True}):#获取小说链接        chapter_name=ch.get_text()#章节名称        chapter_href=ch.get('href')#章节链接#        print(ch.get_text(),'  ',chapter_href)        read_article_XiaoShuo_chapter(article_title,chapter_href)read_article_title('http://www.ranwen.net/files/article/79/79871/')

问题:
1、正则只适合燃文网站,如何只能判断出网页链接,自动在网上寻找,还得研究;
2、燃文网上小说里,嵌入了很多网站标志,还没有找到有效的正则表达方式,比如:
≧燃≮文≥小≌说..a. ≧

燃≧∈≤文≦小说.w.. ≡

≧≧≦燃文小∈说.rn. ≧

燃文∈≯小∈?说..n. ?

燃▼文◆小说网ww、wr-a-n-w、en-.-org

■燃▲文 ▼● w-w、w、.r-a、nw-e、n、.org

▼◆■ ▼★燃文
w-ww、.r、a-n-wen.org


燃▲文 ● w`w-w-.ranwen.org


●燃文小说网w-w-w.ranwen.org

写好的代码,在cmd环境下可以执行下列代码运行

python ***.py
0 0
原创粉丝点击