Python爬虫练习

爬取网络小说并保存至txt文件中

简单梳理下爬取思路:
1、明确想要爬取的小说网站,查看网页源代码
2、分析网页源码的特点,明确章节页的标题、正文所在标签的位置
3、导入需要用到的库文件
4、获取目录页、章节页URL并发送请求
5、使用BeautifulSoup里的select()函数解析章节页正文并剔除冗余部分
6、将爬取到的章节正文写入txt文件中
完整代码如下:

#导入库文件
import requests
from bs4 import BeautifulSoup
#获取章节页并发送请求
def get_one_page(num):
    #获取读书网小说《诡秘之主》的目录页URL
    content_url = 'https://www.dusuu.com/ml/505/'
    #获取章节页URL
    url = content_url + str(num) + '.html'
    try:
        #进行头部伪装
        headers = {
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.55'
        }
        #使用requests.get()方法请求并获取网页内容
        res = requests.get(url, headers = headers)
        #对内容进行编码以显示中文
        res.encoding = 'utf8'
        #请求发送成功情况下返回网页的文本数据
        if res.status_code == 200:
            return res.text
        return None
    except RequestException:
        return None
#解析章节页
def parse_one_page(html):
    #使用python标准库的HTML解析器解析
    soup = BeautifulSoup(html, 'html.parser')
    #利用CSS选择器精确定位元素,使用select()函数解析,提取章节标题与正文
    raw_title = str(soup.select('body > div.content_read > div > div.bookname > h1'))
    #使用replace()函数剔除冗余内容
    title = raw_title.replace('<h1>','').replace('</h1>','')
    raw_body = str(soup.select('#content'))
    body = raw_body.replace('<p>','').replace('</p>','').replace('<div id="content">','').replace('</div>','')
    chapter = [title, body]
    return chapter
#写入txt文件
def write_to_file(chapter):    
    #使用with as语法在with控制块结束时文件会自动关闭
    with open('novel.txt','a',encoding = 'utf-8') as file:
        file.write('\n' +  '=' * 50 +'\n')
        file.write('\n'.join(chapter))
        file.write('\n' +  '=' * 50 +'\n')
     
def main():
    #分页爬取,分析网页url,3533477为小说章节起始编号,章节加1则编号加1
    begin = 3533477
    num = begin
    while num < (begin + 100):
        html = get_one_page(num)
        chapter = parse_one_page(html)
        write_to_file(chapter)
        num += 1

main()

txt文件内容如下:
在这里插入图片描述
说明:爬取网络小说的实际意义不大,只是为做入门级爬虫练习,特意选取无反爬机制的读书网来练手训练。

爬取电影榜单并保存至json文件中

简单梳理下爬取思路:
1、明确想要爬取电影网站,查看网页源代码
2、分析网页源码的特点,明确电影信息所在位置
3、导入需要用到的库文件
4、获取榜单分页URL并发送请求
5、使用正则表达式解析榜单页内容并剔除冗余部分
6、将爬取到的电影信息写入json文件中
完整代码如下(根据崔庆才《网络爬虫开发实战》教材练习内容,代码基本没有变动,只是增加了注释):

#导入库文件
import requests, re, time, json
from requests.exceptions import RequestException
#获取榜单页并发送请求
def get_one_page(url): 
    try:
        #进行头部伪装
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.55'
        }
        #使用 requests.get()方法请求并获取网页内容,加入timeout参数限制请求时间
        res = requests.get(url, headers = headers, timeout = (3, 7))
        #对响应内容进行编码以显示中文
        res.encoding = 'utf8'
        #请求发送成功情况下返回网页的文本数据
        if res.status_code == 200:
            return res.text
        return None
    except RequestException:
        return None
#解析榜单页
def parse_one_page(html): 
    #使用re中的 compile()方法选定,再用 findall()方法提取,获得电影排名、名字、主演、上映时间、评分信息
    pattern = re.compile(
        '<dd>.*?board-index.*?>(\d+)</i>.*?name"><a'
        + '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
        + '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S) 
    items = re.findall(pattern, html)
    #依据单页爬取10部电影信息创建 json对象
    for item in items: 
        #使用 yield语句创建生成器对象
        yield {
            'index':item[0],
            'title':item[1],
            #使用strip()函数去除首尾空格,使用切片剔除重复信息
            'actor':item[2].strip()[3:],
            'time':item[3].strip()[5:],
            'score':item[4] + item[5]
            }
#写入json文件
def write_to_file(info):
    with open('movie.json','a', encoding = 'utf-8') as file:
            file.write(json.dumps(info, indent = 2, ensure_ascii = False) + '\n')
    
def main(offset):
    #获取猫眼电影 top100榜单分页URL
    url = 'https://maoyan.com/board/4?offset=' + str(offset)
    html = get_one_page(url)
    #通过 for循环遍历生成器对象元素
    for item in parse_one_page(html):
        write_to_file(item)

if __name__ == '__main__':
    for i in range(10):
        main(i * 10)
        #设置延时等待,降低被猫眼反爬的风险
        time.sleep(1)

说明:本人眼拙暂时没看出代码问题,但运行后得到空的json文件,有些残念。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值