python爬虫总结

urllib是Python内置的HTTP请求库,它包含4个模块:
    request:最基本的HTTP请求模块,可以用来模拟发送请求。
    error:异常处理模块,如果出现请求错误,可以捕获异常,然后进行重试或其他操作。
    parse:工具模块,提供了许多URL处理方法,如拆分、解析、合并等。
    robotparser:主要用于识别网站的rebots.txt文件,然后判断哪些网站可以爬,哪些网站不可以爬。

在Python中需要通过正则表达式对字符串进⾏匹配的时候,可以使⽤⼀个python自带的模块,名字为re。
正则表达式的大致匹配过程是:
1.依次拿出表达式和文本中的字符比较,
2.如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。
3.如果表达式中有量词或边界,这个过程会稍微有一些不同。
r:Python 中字符串的前导 r 代表原始字符串标识符,该字符串中的特殊符号不会被转义,适用于正则表达式中繁杂的特殊符号表示。 因此 r"\n" 表示包含 '\' 和 'n' 两个字符的字符串,而 "\n" 则表示只包含一个换行符的字符串。

bs4即BeautifulSoup,是python种的一个库,最主要的内容就是从网页中抓取数据。
Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。

 

xlwt仅支持 xls 格式的exce,只能新建xls后写入xls文件

 

代码实现:

from bs4 import BeautifulSoup
import urllib.request, urllib.error
import xlwt  # 进行excel操作
import re
import time

# 获取电影名的规则
findtitle = re.compile(r'<span class="title">(.*?)</span>')
# 创建变量 记录电影链接规则
findlink = re.compile(r'<a href="(.*?)">')
# 获取演员规则
findactors = re.compile(r'<p class="">(.*?)</p>', re.S)  # re.S 让.匹配换行符包括在内
# 获取评分
findscore = re.compile(r'<span class="rating_num" property="v:average">(.*?)</span>')
# 获取评价人数
findsum = re.compile(r'<span>(.*?)人评价</span>')
# 获取图片
findpic = re.compile(r'<img.*src="(.*?)"', re.S)

# 获取简介
findinq = re.compile(r'<span class="inq">(.*?)</span>', re.S)


def main():
    baseurl = "https://movie.douban.com/top250?start="

    # 1、爬取网页
    datalist = getdata(baseurl)

    save_path = ".\\豆瓣电影.xls"

    # 3、保存数据
    saveData(save_path, datalist)


# 爬取网页
def getdata(baseurl):
    datalist = []
    # 使用循环获取所有页面的信息
    for i in range(0, 10):
        url = baseurl + str(i * 25)

        #     # 保存网页源码
        html = askurl(url)
        #     # print(html)
        #
        # 逐一解析数据
        soup = BeautifulSoup(html, "html.parser")

        for item in soup.find_all('div', class_="item"):  # 因为class 是一个类别 ,所以要加_
            # print(item)
            data = []  # 保存一部电影的所有信息
            item = str(item)  # 把item换成字符串类型

            # 获取电影名
            title = re.findall(findtitle, item)[0]
            # print(title)
            # title = '片名是:'+ title
            data.append(title)

            # 获取电影链接
            link = re.findall(findlink, item)[0]
            # print(link)
            # link = "电影链接为:" + link
            data.append(link)

            # 获取图片
            pic = re.findall(findpic, item)[0]
            # pic = "图片链接是:"+ pic
            data.append(pic)
            # print(pic)

            # 获取评价人数
            sum = re.findall(findsum, item)[0]
            # sum = "评价总人数为:" + sum
            data.append(sum)

            # 获取得分
            score = re.findall(findscore, item)[0]
            # score = '得分' + score
            data.append(score)

            # 获取简介
            jianjie = re.findall(findinq, item)
            # jianjie = '影片名言:'+jianjie[0]
            data.append(jianjie)

            # 获取演员
            actors = re.findall(findactors, item)[0]
            actors = re.sub(r'[a-zA-Z]*', '', actors)
            actors = re.sub(r'\xa0*', '', actors)
            actors = re.sub(r'[/]|</>\n ', '', actors)
            actors = re.sub(r' *', '', actors)
            data.append(actors.strip())  # 去掉空格
            # print(actors)
            datalist.append(data)

            time.sleep(0.1)  # 等待0.1s

            # print(data)

    print("爬取成功")
    return datalist


def saveData(save_path, datalist):
    # 创建一个exel对象
    workbook = xlwt.Workbook(encoding='utf-8', style_compression=0)

    # 创建一个工作表
    worksheet = workbook.add_sheet('豆瓣电影top_250', cell_overwrite_ok=True)

    # 设计表头
    col = ('电影名', '电影链接', '图片链接', '评价总人数', '豆瓣得分', '电影de相关描述', '电影概况')
    for j in range(len(col)):
        worksheet.write(0, j, col[j])
    # 循环遍历字典写入exel表格
    for i in range(len(datalist)):
        print("第 %d 部电影" % i)
        data = datalist[i]
        for j in range(len(data)):
            worksheet.write(i + 1, j, data[j])

    # 保存Exel表格
    workbook.save(save_path)


# 得到指定网页的url网页内容
def askurl(url):
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36",

    }
    req = urllib.request.Request(url=url, headers=header)
    html = ''
    try:
        response = urllib.request.urlopen(req)
        html = response.read().decode("utf-8")
        # print(html)

    except:
        print("获取失败")

    return html


if __name__ == "__main__":
    main()

 

 

即BeautifulSoup,是python种的一个库,最主要的内容就是从网页中抓取数据。

Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。

Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
————————————————
版权声明:本文为CSDN博主「- 打小就隔路à」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_54787921/article/details/117728505

 最近发现一个python库lxml提取网页标签内容也十分的简单,浅爬一下fofa

import base64
import requests
from lxml import etree

# https://fofa.info/result?qbase64=ImdsYXNzZmlzaCIgJiYgcG9ydD0iNDg0OCI%3D&page=1&page_size=10

search_data = input("请输入fofa语法")
# search_data = '"glassfish" && port="4848"'
headers = {
    'cookie': '你的cookie',
}
for page in range(1, 3):
    url = 'https://fofa.info/result?page=' + str(page) + '&page_size=10&qbase64='
    search_data_bs64 = str(base64.b64encode(search_data.encode("utf-8")), "utf-8")
    # print(search_data_bs64)
    urls = url + search_data_bs64
    # print(urls)
    result = requests.get(urls, headers=headers).content
    # print(result.decode('utf-8'))
    soup = etree.HTML(result)
    ip_data = soup.xpath('//span[@class="hsxa-host"]/a/@href')
    # print(ip_data)
    ipdate = '\n'.join(ip_data)
    # print(ipdate)
    print('正在提取第' + str(page) + '页数据')
    with open(r'ip.txt', 'a+') as f:
        f.write(ipdate + '\n')
        f.close()

 

这样可以批量爬取资产,验证poc或者exp都是不错的

 

posted @ 2023-02-28 12:03  木易同学  阅读(86)  评论(0编辑  收藏  举报