网页数据抓取怎么写(Python爬虫初探初探为什么选择Python?爬虫是什么?网络爬虫)
优采云 发布时间: 2022-01-13 22:06网页数据抓取怎么写(Python爬虫初探初探为什么选择Python?爬虫是什么?网络爬虫)
初探 Python 爬虫 为什么选择 Python?什么是爬虫?
网络爬虫(也称为网络蜘蛛、网络机器人,在 FOAF 社区中,通常称为网络追逐者)是根据某些规则自动从万维网上爬取信息的程序或脚本。
基本知识概念
URL(协议(服务模式)+IP地址(含端口号)+具体地址),即统一资源定位器,也就是我们所说的网站,统一资源定位器就是可以定位和访问的资源从 Internet 获得 方法的简洁表示是 Internet 上标准资源的地址。Internet 上的每个文件都有一个唯一的 URL,其中收录指示文件位置以及浏览器应该如何处理它的信息。爬虫在爬取数据时,必须有目标URL才能获取数据。因此,它是爬虫获取数据的基本依据。
URI 在计算机术语中,统一资源标识符 (URI) 是用于标识 Internet 资源名称的字符串。这种标识允许用户通过特定的协议与任何(包括本地和互联网)资源进行交互。URI 由收录特定语法和相关协议的方案定义。
浏览网页的过程
在用户浏览网页的过程中,我们可能会看到很多漂亮的图片,比如我们会看到几张图片和百度搜索框,这个过程其实就是用户输入网址后,经过DNS服务器,找到服务器主机, 向服务器发送请求。服务器解析后,将HTML、JS、CSS等文件发送到用户的浏览器。浏览器解析后,用户可以看到各种图片。其实就是一个http请求的过程。
爬虫入门
常用爬虫库
请求库:requests、selenium(自动化测试工具)+ChromeDrive(chrome驱动)、PhantomJS(无界面浏览器)
解析库:LXML(html、xml、Xpath方法)、BeautifulSoup(html、xml)、PyQuery(支持css选择器)、Tesserocr(光学字符识别、验证码)
数据库:mongo、mysql、redis
存储库:pymysql、pymongo、redispy、RedisDump(用于导入和导出 Redis 数据的工具)
网络库:Flask(轻量级网络服务器)、Django
其他工具:Charles(网络抓包工具)
示例(如果 cookie 不起作用,您可以更改) 基本示例
myUrl = "https://m.qiushibaike.com/hot/page/" + page
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-Agent': user_agent}
#请求头相关
print(myUrl)
req = request.Request(myUrl, headers=headers)
#调用库发送请求
myResponse = request.urlopen(req)
myPage = myResponse.read()
# encode的作用是将unicode编码转换成其他编码的字符串
# decode的作用是将其他编码的字符串转换成unicode编码
unicodePage = myPage.decode("utf-8")
print(unicodePage)
一个比较复杂的例子是爬虫百科网站,拉出作者头像、作者姓名、内容
修改自:
<p># -*- coding: utf-8 -*-
import urllib
import _thread
import re
import time
from urllib import request
# ----------- 加载处理糗事百科 -----------
class Spider_Model:
def __init__(self):
self.page = 1
self.pages = []
self.enable = False
# 将所有的段子都扣出来,添加到列表中并且返回列表
def GetPage(self, page):
myUrl = "https://m.qiushibaike.com/hot/page/" + page
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-Agent': user_agent}
print(myUrl)
req = request.Request(myUrl, headers=headers)
myResponse = request.urlopen(req)
myPage = myResponse.read()
# print(myPage)
# encode的作用是将unicode编码转换成其他编码的字符串
# decode的作用是将其他编码的字符串转换成unicode编码
unicodePage = myPage.decode("utf-8")
print(unicodePage)
# 找出所有class="content"的div标记
# re.S是任意匹配模式,也就是.可以匹配换行符
# myItems = re.findall('(.*?)', unicodePage, re.S)
content = re.findall('.*?(.*?)(.*?)', unicodePage, re.S)
items = []
# print("~~~~~~~~~~~~~~~~~~~")
# print(content)
# print(len(content))
# print(content[1])
imageIcon = re.findall('.*?(.*?)', unicodePage, re.S)
# print("~~~~~~~~~~~~~~~~~~~")
# print(imageIcon)
# print(len(imageIcon))
# print(imageIcon[0][0])
# print(imageIcon[0][1])
# print(imageIcon[1][0])
# print(imageIcon[1][1])
for index in range(min(len(content), len(imageIcon)) - 1):
items.append([content[index][0].replace("\n", "").replace("
", ""), imageIcon[index][0], imageIcon[index][1]])
return items
# 用于加载新的段子
def LoadPage(self):
# 如果用户未输入quit则一直运行
while self.enable:
# 如果pages数组中的内容小于2个
if len(self.pages)