Python爬虫的简单代码

3 篇文章 0 订阅
3 篇文章 0 订阅

用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.request
import re


def 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值