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()
最近发现一个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都是不错的