
动态网页抓取
动态网页抓取(不用动态渲染的页面来说管网页后台的Ajax接口有哪些参数 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 76 次浏览 • 2022-04-04 20:11
)
之前我们了解了Ajax的分析爬取方式,其实就是JavaScript动态渲染页面的一种情况。通过直接分析Ajax,我们仍然可以使用requests或者urllib来实现数据爬取。
但是,JavaScript 渲染的页面不仅仅是 Ajax。为了解决这些问题,我们可以直接使用模拟浏览器操作的方式。这样就可以在浏览器中看到它长什么样了,抓取到什么源码,也就是可见就可以爬取了。这样,我们就不再需要关心网页内部的 JavaScript 使用什么算法来渲染页面,也不需要关心网页后台的 Ajax 接口的参数。
硒的使用
Selenium 是一个自动化测试工具,可以用来驱动浏览器执行特定的动作,比如点击、下拉等,同时还可以获取当前渲染的页面的源代码浏览器,以便它在可见时可以被抓取。对于一些 JavaScript 动态渲染的页面,这种爬取方式非常有效。
准备好工作了
这里我们以 Chrome 为例来说明 Selenium 的使用。在开始之前,请确保您已正确安装 Chrome 浏览器并使用 ChromeDriver 进行配置(以匹配您的浏览器版本)。此外,需要正确安装 Python 的 Selenium 库。
基本用途
首先,让我们大致了解一下 Selenium 的一些功能。一个例子如下:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
try:
driver.get('https://www.baidu.com 查看全部
动态网页抓取(不用动态渲染的页面来说管网页后台的Ajax接口有哪些参数
)
之前我们了解了Ajax的分析爬取方式,其实就是JavaScript动态渲染页面的一种情况。通过直接分析Ajax,我们仍然可以使用requests或者urllib来实现数据爬取。
但是,JavaScript 渲染的页面不仅仅是 Ajax。为了解决这些问题,我们可以直接使用模拟浏览器操作的方式。这样就可以在浏览器中看到它长什么样了,抓取到什么源码,也就是可见就可以爬取了。这样,我们就不再需要关心网页内部的 JavaScript 使用什么算法来渲染页面,也不需要关心网页后台的 Ajax 接口的参数。
硒的使用
Selenium 是一个自动化测试工具,可以用来驱动浏览器执行特定的动作,比如点击、下拉等,同时还可以获取当前渲染的页面的源代码浏览器,以便它在可见时可以被抓取。对于一些 JavaScript 动态渲染的页面,这种爬取方式非常有效。
准备好工作了
这里我们以 Chrome 为例来说明 Selenium 的使用。在开始之前,请确保您已正确安装 Chrome 浏览器并使用 ChromeDriver 进行配置(以匹配您的浏览器版本)。此外,需要正确安装 Python 的 Selenium 库。
基本用途
首先,让我们大致了解一下 Selenium 的一些功能。一个例子如下:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
try:
driver.get('https://www.baidu.com
动态网页抓取(一个爬虫项目目录结构(一)--一个 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 218 次浏览 • 2022-04-04 20:08
)
我们首先创建一个爬虫项目,这里我们使用scrapy框架来创建它。
scrapy startproject poco
然后cd到poco文件夹初始化项目
scrapy genspider pocoSpider poco.com
打开项目,项目目录结构如下
我们的爬虫代码写在 pocoSpider 文件中,现在我们打开 网站 来分析网页。
我们选择人像分类爬行
可以看到页面上有很多用户id。我们需要先获取每个id的url,然后去详情页抓图。
右键查看网页源码,发现该页面是js动态生成的网页
并且页面是懒加载的,右键检查元素,查看网络
如果找到请求的图片,请获取请求参数,url地址,复制到postman中调用,成功获取返回数据
分析请求参数,猜测是否可以通过,修改参数得到响应结果,但是修改请求参数后,请求失败,看来直接修改参数的方法无法得到我们需要的url地址。
让我们随意点击查看网页源代码,看看细节是否也是js动态加载的。
好在我们需要的数据可以直接在源码中查看,每张图片的地址都在标签里面,很简单。我们可以先爬取这个页面的图片
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
class PocospiderSpider(scrapy.Spider):
name = 'pocoSpider'
allowed_domains = ['poco.com']
start_urls = ['https://www.poco.cn/works/deta ... 39%3B]
def parse(self, response):
img_list = response.xpath("//img/@data-src").extract()
for img in img_list:
print(img)
if __name__ == "__main__":
process = CrawlerProcess(get_project_settings())
process.crawl('pocoSpider')
process.start()
不出所料,我们成功拿到了当前id下的所有图片:
现在我们只需要获取所有id对应的url地址并回收请求就可以获取所有图片的地址
由于无法通过修改参数获取数据,所以我们使用selenium框架来模拟浏览器操作。
分析页面,每次拉到最后都发送一个请求。我们关闭页面的图片加载以加快访问速度。我们将爬取的数据存储在数据库中,这里我们使用mongod。定义下拉刷新函数,每次刷新后execute_times sleep 0.5秒,以便浏览器渲染页面。这里我们刷新 40 次来获取数据。
我们在setting.py文件中设置数据库的地址、端口、数据库名
LOCAL_MONGO_HOST = '127.0.0.1'
LOCAL_MONGO_PORT = 27017
DB_NAME = 'POCO'
编写 selenium 模拟操作的代码
执行完之后大概能拿到800多条数据,现在我们重写爬虫代码。
import pymongo
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from poco.settings import LOCAL_MONGO_HOST,LOCAL_MONGO_PORT,DB_NAME
class PocospiderSpider(scrapy.Spider):
name = 'pocoSpider'
mongo_client = pymongo.MongoClient(LOCAL_MONGO_HOST, LOCAL_MONGO_PORT)
collection = mongo_client[DB_NAME]["idlist"]
id_list = collection.find()
def start_requests(self):
for id in self.id_list:
item = {}
item["folder"]=id["_id"]
item["img_urls"]=[]
yield scrapy.Request(url=id["url"],callback=self.parse_detail,meta={"item":item})
def parse_detail(self, response):
item = response.meta["item"]
img_list = response.xpath("//img/@data-src").extract()
for img in img_list:
if img == "":
continue
img = "https:"+img
item["img_urls"].append(img)
yield item
if __name__ == "__main__":
process = CrawlerProcess(get_project_settings())
process.crawl('pocoSpider')
process.start()
我们scrapy管道下载图片,我们先写一个管道方法通过id存储图片,我们重写file_path方法修改图片的存储路径
from scrapy.exceptions import DropItem
from scrapy.pipelines.images import ImagesPipeline
from scrapy import Request
class MyImagesPipeline(ImagesPipeline):
def get_media_requests(self, item, info):
for image_url in item['img_urls']:
referer = image_url
yield Request(image_url,meta={'item':item,'referer':referer})
def file_path(self, request, response=None, info=None):
item = request.meta['item']
folder = item['folder'].strip()
img_name = request.url.split("/")[-1]
filename = u'img/{0}/{1}'.format(folder,img_name)
return filename
def item_completed(self, results, item, info):
image_path = [x['path'] for ok,x in results if ok]
if not image_path:
raise DropItem('Item contains no images')
# item['image_paths'] = image_path
return item
最后我们修改设置文件中的图片下载中间件和PipeLines
DOWNLOADER_MIDDLEWARES = {
'poco.middlewares.PocoDownloaderMiddleware': 543,
}
IMAGES_STORE=r'E:\\'
IMAGES_EXPIRES = 30
# Enable or disable extensions
# See https://doc.scrapy.org/en/late ... .html
#EXTENSIONS = {
# 'scrapy.extensions.telnet.TelnetConsole': None,
#}
ITEM_PIPELINES = {
'poco.pipelines.MyImagesPipeline': 300,
}
CONCURRENT_REQUESTS = 32
DOWNLOAD_DELAY = 0.1
# Configure item pipeli
至此,poco网站的爬虫已经写好,代码运行完毕,图片爬取成功,按照id分类存储
后记:其实爬虫代码还是有bug的。当爬虫运行 10 分钟,没有爬取到 id 时,会自动停止。仔细查看代码,发现一个mongodb的坑。那是
collection = mongo_client[DB_NAME]["idlist"]
id_list = collection.find()
当调用 db.采集.find() 时,它返回的不是所有数据,而是一个“光标”。它的默认行为是:首先在数据库中查询 101 个文档,或者 1 MB 的文档,这取决于首先满足哪个条件;然后每次游标用完时,查询 4 MB 的文档。此外,find() 的默认行为是返回一个在 10 分钟不活动后超时的游标。如果 10 分钟内没有处理请求,那么我们将无法获取剩余的 url,因此爬虫将停止。
解决方法也很简单,就是直接将id_list中的数据存入开头的list中。
# -*- coding: utf-8 -*-
import pymongo
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from poco.settings import LOCAL_MONGO_HOST,LOCAL_MONGO_PORT,DB_NAME
class PocospiderSpider(scrapy.Spider):
name = 'pocoSpider'
mongo_client = pymongo.MongoClient(LOCAL_MONGO_HOST, LOCAL_MONGO_PORT)
collection = mongo_client[DB_NAME]["idlist"]
id_list = collection.find()
ids=[]
for id in id_list:
ids.append(id)
def start_requests(self):
for id in self.ids:
item = {}
item["folder"]=id["_id"]
item["img_urls"]=[]
yield scrapy.Request(url=id["url"],callback=self.parse_detail,meta={"item":item})
def parse_detail(self, response):
item = response.meta["item"]
img_list = response.xpath("//img/@data-src").extract()
for img in img_list:
if img == "":
continue
img = "https:"+img
item["img_urls"].append(img)
yield item
if __name__ == "__main__":
process = CrawlerProcess(get_project_settings())
process.crawl('pocoSpider')
process.start() 查看全部
动态网页抓取(一个爬虫项目目录结构(一)--一个
)
我们首先创建一个爬虫项目,这里我们使用scrapy框架来创建它。
scrapy startproject poco
然后cd到poco文件夹初始化项目
scrapy genspider pocoSpider poco.com
打开项目,项目目录结构如下

我们的爬虫代码写在 pocoSpider 文件中,现在我们打开 网站 来分析网页。
我们选择人像分类爬行
可以看到页面上有很多用户id。我们需要先获取每个id的url,然后去详情页抓图。
右键查看网页源码,发现该页面是js动态生成的网页

并且页面是懒加载的,右键检查元素,查看网络

如果找到请求的图片,请获取请求参数,url地址,复制到postman中调用,成功获取返回数据

分析请求参数,猜测是否可以通过,修改参数得到响应结果,但是修改请求参数后,请求失败,看来直接修改参数的方法无法得到我们需要的url地址。
让我们随意点击查看网页源代码,看看细节是否也是js动态加载的。

好在我们需要的数据可以直接在源码中查看,每张图片的地址都在标签里面,很简单。我们可以先爬取这个页面的图片
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
class PocospiderSpider(scrapy.Spider):
name = 'pocoSpider'
allowed_domains = ['poco.com']
start_urls = ['https://www.poco.cn/works/deta ... 39%3B]
def parse(self, response):
img_list = response.xpath("//img/@data-src").extract()
for img in img_list:
print(img)
if __name__ == "__main__":
process = CrawlerProcess(get_project_settings())
process.crawl('pocoSpider')
process.start()
不出所料,我们成功拿到了当前id下的所有图片:

现在我们只需要获取所有id对应的url地址并回收请求就可以获取所有图片的地址
由于无法通过修改参数获取数据,所以我们使用selenium框架来模拟浏览器操作。
分析页面,每次拉到最后都发送一个请求。我们关闭页面的图片加载以加快访问速度。我们将爬取的数据存储在数据库中,这里我们使用mongod。定义下拉刷新函数,每次刷新后execute_times sleep 0.5秒,以便浏览器渲染页面。这里我们刷新 40 次来获取数据。
我们在setting.py文件中设置数据库的地址、端口、数据库名
LOCAL_MONGO_HOST = '127.0.0.1'
LOCAL_MONGO_PORT = 27017
DB_NAME = 'POCO'
编写 selenium 模拟操作的代码
执行完之后大概能拿到800多条数据,现在我们重写爬虫代码。
import pymongo
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from poco.settings import LOCAL_MONGO_HOST,LOCAL_MONGO_PORT,DB_NAME
class PocospiderSpider(scrapy.Spider):
name = 'pocoSpider'
mongo_client = pymongo.MongoClient(LOCAL_MONGO_HOST, LOCAL_MONGO_PORT)
collection = mongo_client[DB_NAME]["idlist"]
id_list = collection.find()
def start_requests(self):
for id in self.id_list:
item = {}
item["folder"]=id["_id"]
item["img_urls"]=[]
yield scrapy.Request(url=id["url"],callback=self.parse_detail,meta={"item":item})
def parse_detail(self, response):
item = response.meta["item"]
img_list = response.xpath("//img/@data-src").extract()
for img in img_list:
if img == "":
continue
img = "https:"+img
item["img_urls"].append(img)
yield item
if __name__ == "__main__":
process = CrawlerProcess(get_project_settings())
process.crawl('pocoSpider')
process.start()
我们scrapy管道下载图片,我们先写一个管道方法通过id存储图片,我们重写file_path方法修改图片的存储路径
from scrapy.exceptions import DropItem
from scrapy.pipelines.images import ImagesPipeline
from scrapy import Request
class MyImagesPipeline(ImagesPipeline):
def get_media_requests(self, item, info):
for image_url in item['img_urls']:
referer = image_url
yield Request(image_url,meta={'item':item,'referer':referer})
def file_path(self, request, response=None, info=None):
item = request.meta['item']
folder = item['folder'].strip()
img_name = request.url.split("/")[-1]
filename = u'img/{0}/{1}'.format(folder,img_name)
return filename
def item_completed(self, results, item, info):
image_path = [x['path'] for ok,x in results if ok]
if not image_path:
raise DropItem('Item contains no images')
# item['image_paths'] = image_path
return item
最后我们修改设置文件中的图片下载中间件和PipeLines
DOWNLOADER_MIDDLEWARES = {
'poco.middlewares.PocoDownloaderMiddleware': 543,
}
IMAGES_STORE=r'E:\\'
IMAGES_EXPIRES = 30
# Enable or disable extensions
# See https://doc.scrapy.org/en/late ... .html
#EXTENSIONS = {
# 'scrapy.extensions.telnet.TelnetConsole': None,
#}
ITEM_PIPELINES = {
'poco.pipelines.MyImagesPipeline': 300,
}
CONCURRENT_REQUESTS = 32
DOWNLOAD_DELAY = 0.1
# Configure item pipeli
至此,poco网站的爬虫已经写好,代码运行完毕,图片爬取成功,按照id分类存储

后记:其实爬虫代码还是有bug的。当爬虫运行 10 分钟,没有爬取到 id 时,会自动停止。仔细查看代码,发现一个mongodb的坑。那是
collection = mongo_client[DB_NAME]["idlist"]
id_list = collection.find()
当调用 db.采集.find() 时,它返回的不是所有数据,而是一个“光标”。它的默认行为是:首先在数据库中查询 101 个文档,或者 1 MB 的文档,这取决于首先满足哪个条件;然后每次游标用完时,查询 4 MB 的文档。此外,find() 的默认行为是返回一个在 10 分钟不活动后超时的游标。如果 10 分钟内没有处理请求,那么我们将无法获取剩余的 url,因此爬虫将停止。
解决方法也很简单,就是直接将id_list中的数据存入开头的list中。
# -*- coding: utf-8 -*-
import pymongo
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from poco.settings import LOCAL_MONGO_HOST,LOCAL_MONGO_PORT,DB_NAME
class PocospiderSpider(scrapy.Spider):
name = 'pocoSpider'
mongo_client = pymongo.MongoClient(LOCAL_MONGO_HOST, LOCAL_MONGO_PORT)
collection = mongo_client[DB_NAME]["idlist"]
id_list = collection.find()
ids=[]
for id in id_list:
ids.append(id)
def start_requests(self):
for id in self.ids:
item = {}
item["folder"]=id["_id"]
item["img_urls"]=[]
yield scrapy.Request(url=id["url"],callback=self.parse_detail,meta={"item":item})
def parse_detail(self, response):
item = response.meta["item"]
img_list = response.xpath("//img/@data-src").extract()
for img in img_list:
if img == "":
continue
img = "https:"+img
item["img_urls"].append(img)
yield item
if __name__ == "__main__":
process = CrawlerProcess(get_project_settings())
process.crawl('pocoSpider')
process.start()
动态网页抓取(动态网页是什么动态网页文件的扩展名有哪些,以及静态网页的区别)
网站优化 • 优采云 发表了文章 • 0 个评论 • 104 次浏览 • 2022-04-04 16:02
网站可以选择不同的页面类型进行构建,分为动态页面和静态页面。之前作者已经给大家介绍过静态页面。本文将重点介绍动态页面,看看什么是动态页面,动态页面网页文件的扩展名是什么,动态网页和静态网页有什么区别。
一、什么是动态网页
所谓动态网页,是指相对于静态网页的一种网页编程技术。对于静态网页,随着html代码的生成,页面的内容和显示效果基本不会改变——除非你修改了页面代码。动态网页并非如此。虽然页面代码没有改变,但是显示的内容会随着时间、环境或数据库操作的结果而改变。
动态网页的特点:
1.交互性:网页根据用户请求动态变化和显示内容
2.自动更新:新的页面内容将自动生成,无需更改页面代码。
3.随机性:在不同的时间,不同的人同时访问同一个URL会有不同的页面效果,比如普通用户和系统管理员。
二、动态网页文件的扩展
网站正在建设的动态网页后缀为.asp、.jsp、.php、.perl、.cgi等形式,并且有一个标志性的符号——“?” 在动态网站 URL 中。这里所说的动态网页与网页上的各种动画、滚动字幕等视觉“动态效果”没有直接关系。动态网页也可以是纯文本内容或收录各种动画。这些只是网页具体内容的呈现形式,无论网页是否具有动态效果,采用动态网站技术生成的网页都称为动态网页。
三、动态网页和静态网页的区别1、动态网页和静态网页在更新维护上的区别:
一旦静态网页内容发布到 网站 服务器上,无论是否有用户访问,这些网页内容都会保存在 网站 服务器上。如果你想修改一个网页的内容,你必须修改它的源代码并重新上传到服务器。静态网页没有数据库支持。当网站信息量很大时,网页的创建和维护都比较困难
动态网页可以根据不同的用户请求、时间或环境要求动态生成不同的网页内容,而动态网页一般都是基于数据库技术的,可以大大减少网站维护的工作量
2、动态网页和静态网页在交互性方面的区别:
静态网页的交互性较差,因为许多内容是固定的并且在功能上有很大的限制。
动态网页可以实现更多的功能,如用户登录、注册、查询等。
3、动态网页和静态网页在响应速度上的区别:
静态网页的内容比较固定,容易被搜索引擎检索到,不需要连接数据库,所以响应速度比较快
动态网页实际上并不是独立存在于服务器上的网页文件。服务器只有在用户请求时才返回一个完整的网页,这涉及到数据连接访问和查询等一系列过程,所以响应速度比较慢。
4、动态网页和静态网页在访问特性方面的区别:
静态网页的每个网页都有一个固定的网址,网页网址后缀为.htm、.html、.shtml等常用格式,不收录“?”,可直接双开点击
这 ”?” 在动态网页中对搜索引擎有一定的问题。一般情况下,搜索引擎不可能从网站的数据库中访问所有网页,或者出于技术考虑,在搜索过程中不爬取。“?”后面的内容 URL中的不能直接双击打开
关于动态页面的问题,本文重点介绍什么是动态网页,动态网页的文件扩展名有哪些,动态网页和静态网页有什么区别。通过本文的内容,你应该可以对动态页面有一个足够的了解。在网站优化方面,搜索引擎已经能够很好的识别动态页面,所以合适的动态页面不会影响seo。不过目前更多的网站还是选择静态页面,或者说是伪静态页面。 查看全部
动态网页抓取(动态网页是什么动态网页文件的扩展名有哪些,以及静态网页的区别)
网站可以选择不同的页面类型进行构建,分为动态页面和静态页面。之前作者已经给大家介绍过静态页面。本文将重点介绍动态页面,看看什么是动态页面,动态页面网页文件的扩展名是什么,动态网页和静态网页有什么区别。
一、什么是动态网页
所谓动态网页,是指相对于静态网页的一种网页编程技术。对于静态网页,随着html代码的生成,页面的内容和显示效果基本不会改变——除非你修改了页面代码。动态网页并非如此。虽然页面代码没有改变,但是显示的内容会随着时间、环境或数据库操作的结果而改变。
动态网页的特点:
1.交互性:网页根据用户请求动态变化和显示内容
2.自动更新:新的页面内容将自动生成,无需更改页面代码。
3.随机性:在不同的时间,不同的人同时访问同一个URL会有不同的页面效果,比如普通用户和系统管理员。
二、动态网页文件的扩展
网站正在建设的动态网页后缀为.asp、.jsp、.php、.perl、.cgi等形式,并且有一个标志性的符号——“?” 在动态网站 URL 中。这里所说的动态网页与网页上的各种动画、滚动字幕等视觉“动态效果”没有直接关系。动态网页也可以是纯文本内容或收录各种动画。这些只是网页具体内容的呈现形式,无论网页是否具有动态效果,采用动态网站技术生成的网页都称为动态网页。
三、动态网页和静态网页的区别1、动态网页和静态网页在更新维护上的区别:
一旦静态网页内容发布到 网站 服务器上,无论是否有用户访问,这些网页内容都会保存在 网站 服务器上。如果你想修改一个网页的内容,你必须修改它的源代码并重新上传到服务器。静态网页没有数据库支持。当网站信息量很大时,网页的创建和维护都比较困难
动态网页可以根据不同的用户请求、时间或环境要求动态生成不同的网页内容,而动态网页一般都是基于数据库技术的,可以大大减少网站维护的工作量
2、动态网页和静态网页在交互性方面的区别:
静态网页的交互性较差,因为许多内容是固定的并且在功能上有很大的限制。
动态网页可以实现更多的功能,如用户登录、注册、查询等。
3、动态网页和静态网页在响应速度上的区别:
静态网页的内容比较固定,容易被搜索引擎检索到,不需要连接数据库,所以响应速度比较快
动态网页实际上并不是独立存在于服务器上的网页文件。服务器只有在用户请求时才返回一个完整的网页,这涉及到数据连接访问和查询等一系列过程,所以响应速度比较慢。
4、动态网页和静态网页在访问特性方面的区别:
静态网页的每个网页都有一个固定的网址,网页网址后缀为.htm、.html、.shtml等常用格式,不收录“?”,可直接双开点击
这 ”?” 在动态网页中对搜索引擎有一定的问题。一般情况下,搜索引擎不可能从网站的数据库中访问所有网页,或者出于技术考虑,在搜索过程中不爬取。“?”后面的内容 URL中的不能直接双击打开
关于动态页面的问题,本文重点介绍什么是动态网页,动态网页的文件扩展名有哪些,动态网页和静态网页有什么区别。通过本文的内容,你应该可以对动态页面有一个足够的了解。在网站优化方面,搜索引擎已经能够很好的识别动态页面,所以合适的动态页面不会影响seo。不过目前更多的网站还是选择静态页面,或者说是伪静态页面。
动态网页抓取(,论丈摘要基于Lucene的网页与系统实现的相关理论与使用方法)
网站优化 • 优采云 发表了文章 • 0 个评论 • 315 次浏览 • 2022-04-04 16:02
本学位论文作者及导师充分了解东北大学关于学位论文保存和使用的规定:即学校有权将学位论文的副本和磁盘留存并送交国家有关部门或机构,允许学位论文发表。可供参考和借阅。本人同意东北大学可以将论文的全部或部分内容编入相关数据库进行检索和交流。
(如作者与导师不同意在线交流,请在下方签字,否则视为同意。)
论文作者签名: 导师签名:
签名日期:签名日期
H
"
吨
,,
•
.
,.
"r
东北大学硕士学位论文摘要
基于Lucene的网络爬取与检索系统
,
概括
随着互联网的发展和Web资源的丰富,利用Web全文信息检索系统获取所需信息已成为人们日常生活的重要组成部分。
-^,·,准确高效地查找信息。
介绍了Web信息检索和系统实现的相关理论和技术。
在Web全文信息检索中的应用得到了深入的实践。第二章介绍了论文的相关理论,如搜索引擎的类型、中文分词方法、倒排索引理论以及论文中使用的Lucene的原理和使用。针对网页的特点,提出了两种网页模板分析算法。第一种算法基于最长公共子序列模型,采用动态规划的方法寻找最优解。对原创文档的算法进行优化和扩展,达到查找网页模板字符串和插入字符串的目的,二次算法利用相关的统计理论和原理,将网页模板抽象成数学模型,并在网页的开始位置和结束位置提取网页的共同logo,根据文本的长度计算不同的方差,确定文本在原文中的位置,从而得到文本的内容可以从网页中提取,从而节省空间,减少索引和搜索的时间。比较了两种算法的优缺点。第四章介绍了一个用Java开发的网络蜘蛛,包括异构数据的处理,如word、pdf、rtf等文本 以便从网页中提取文本的内容,从而节省空间,减少索引和搜索的时间。比较了两种算法的优缺点。第四章介绍了一个用Java开发的网络蜘蛛,包括异构数据的处理,如word、pdf、rtf等文本 以便从网页中提取文本的内容,从而节省空间,减少索引和搜索的时间。比较了两种算法的优缺点。第四章介绍了一个用Java开发的网络蜘蛛,包括异构数据的处理,如word、pdf、rtf等文本
此外,还介绍了一种解析HTML文件的方法以及多线程的使用。第五章实现了网络爬虫系统,自动从互联网上下载用户指定的网页信息,包括内容和下一页。提高了搜索速度,提高了信息的准确性和及时性,节省了大量的存储空间。
之间。
从理论和实践的角度来看,本文既包括算法的设计和分析,也包括具体程序的实现,使用了Oracle、Tomcat、Jsp、Java、Eclipse、Lucene等软件和语言。
HTML解析方法为用户节省了时间,提高了工作效率。
关键词:公共子序列;网络蜘蛛:Lucene;倒排索引;全文检索
-
'
一种
唱,
绿色
Ĵ
ü
Ĵ
'
'
东北大学硕士论文摘要
基于Lucene的网站爬虫与检索系统
抽象的
●
随着开发工作和Web资源的扩展,如何
我是
'系统已成为日常生活的重要组成部分,用户越来越多
关心如何更准确、更有效地查找信息。
本文介绍了Web信息检索系统及其相关理论和技术,并进行了深入的实践,展示了如何从Web信息中获取信息。 查看全部
动态网页抓取(,论丈摘要基于Lucene的网页与系统实现的相关理论与使用方法)
本学位论文作者及导师充分了解东北大学关于学位论文保存和使用的规定:即学校有权将学位论文的副本和磁盘留存并送交国家有关部门或机构,允许学位论文发表。可供参考和借阅。本人同意东北大学可以将论文的全部或部分内容编入相关数据库进行检索和交流。
(如作者与导师不同意在线交流,请在下方签字,否则视为同意。)
论文作者签名: 导师签名:
签名日期:签名日期
H
"
吨
,,
•
.
,.
"r
东北大学硕士学位论文摘要
基于Lucene的网络爬取与检索系统
,
概括
随着互联网的发展和Web资源的丰富,利用Web全文信息检索系统获取所需信息已成为人们日常生活的重要组成部分。
-^,·,准确高效地查找信息。
介绍了Web信息检索和系统实现的相关理论和技术。
在Web全文信息检索中的应用得到了深入的实践。第二章介绍了论文的相关理论,如搜索引擎的类型、中文分词方法、倒排索引理论以及论文中使用的Lucene的原理和使用。针对网页的特点,提出了两种网页模板分析算法。第一种算法基于最长公共子序列模型,采用动态规划的方法寻找最优解。对原创文档的算法进行优化和扩展,达到查找网页模板字符串和插入字符串的目的,二次算法利用相关的统计理论和原理,将网页模板抽象成数学模型,并在网页的开始位置和结束位置提取网页的共同logo,根据文本的长度计算不同的方差,确定文本在原文中的位置,从而得到文本的内容可以从网页中提取,从而节省空间,减少索引和搜索的时间。比较了两种算法的优缺点。第四章介绍了一个用Java开发的网络蜘蛛,包括异构数据的处理,如word、pdf、rtf等文本 以便从网页中提取文本的内容,从而节省空间,减少索引和搜索的时间。比较了两种算法的优缺点。第四章介绍了一个用Java开发的网络蜘蛛,包括异构数据的处理,如word、pdf、rtf等文本 以便从网页中提取文本的内容,从而节省空间,减少索引和搜索的时间。比较了两种算法的优缺点。第四章介绍了一个用Java开发的网络蜘蛛,包括异构数据的处理,如word、pdf、rtf等文本
此外,还介绍了一种解析HTML文件的方法以及多线程的使用。第五章实现了网络爬虫系统,自动从互联网上下载用户指定的网页信息,包括内容和下一页。提高了搜索速度,提高了信息的准确性和及时性,节省了大量的存储空间。
之间。
从理论和实践的角度来看,本文既包括算法的设计和分析,也包括具体程序的实现,使用了Oracle、Tomcat、Jsp、Java、Eclipse、Lucene等软件和语言。
HTML解析方法为用户节省了时间,提高了工作效率。
关键词:公共子序列;网络蜘蛛:Lucene;倒排索引;全文检索
-
'
一种
唱,
绿色
Ĵ
ü
Ĵ
'
'
东北大学硕士论文摘要
基于Lucene的网站爬虫与检索系统
抽象的
●
随着开发工作和Web资源的扩展,如何
我是
'系统已成为日常生活的重要组成部分,用户越来越多
关心如何更准确、更有效地查找信息。
本文介绍了Web信息检索系统及其相关理论和技术,并进行了深入的实践,展示了如何从Web信息中获取信息。
动态网页抓取(爬取百度百科的历史记录,结果在时隔四个月之后再次遇到的对手)
网站优化 • 优采云 发表了文章 • 0 个评论 • 378 次浏览 • 2022-04-04 02:02
动态页面爬取
很久没有写爬虫了。今天敲了一个爬虫——爬百度百科的历史记录。结果时隔四个月再次遇到的对手居然是动态页面(我一开始觉得百度太简单了。),但经过一番努力,还是达到了自己的目标,然后就写了博客作为评论。
一、概念
动态页面实际上是相对于静态页面的。面对静态页面时,直接查看响应一般是网页的整个代码,而动态页面则不然。一般来说,当再次打开动态页面的响应时,会与您在网页上看到的有所不同。
二、练习和练习前
因为我很喜欢练习,所以我会一言不发地练习,练习会给你真正的知识,你多练习就会明白。
目标网页:万科百度百科历史版本实现环境:win32版本:python3.6.2 实际目标:获取万科百度百科历史版本历史修改时间并制作图表或csv文件
三、流程说明
和所有爬虫一样,我们的第一步会是分析网页,因为我们的目标选择的是动态网页,所以我们还需要跟踪json文件等等。过程:
1、网页分析2、查询跟踪json等文件或xhr 3、文本匹配4、绘制或制作csv
四、工具准备
我们需要的库是(所有最新版本):
1.requests 2.re(以下库对于爬虫来说不是必需的,但它们是我这次需要的)3.matplotlib(用于可视化)4.datetime(用于时间操作)5.Pandas(python强大的数据处理库)6.os(系统操作)(我更喜欢原来的re库,当然这里用正则表达式可以解决所有问题)
你需要知道的:
1.python语法基础2.正则表达式匹配规则(以下不是爬虫必备)3.datetime一些基本功能4.matplotlib可视化操作(虽然这不是爬虫必须的,但很多情况下,数据可视化会让数据更直观,更容易做出判断)5.pandas库的基本使用(非爬虫必备,但数据分析必须学会)
五、网页分析
首先我们打开我们的目标页面→万科百度百科历史版。
好像一切正常,然后我们查看url,也有前面提到的规则,但是真的一切正常吗?
如果你把这个页面做为静态页面,那肯定是完蛋了,因为我一开始就是这样做的,当你在第一页查找代码时,你会发现一切正常,但是当你在第二页查找代码时page 有时,您会发现一个事实,即您在第二页甚至最后一页上看到的最后一个代码是相同的。你觉得这有悖常理吗?
六、关注
其实不然,这是很正常的事情,很多页面会被做成动态的,使用json或者其他文件传输数据(不准确,也可能使用java,javascript等代码调用端口等),这样就可以了更安全。这时候很多人会选择使用fiddle等第三方软件抓包,比较方便,但是这里笔者比较吃力,所以直接在控制器平台上观看即可。经过一番搜索,我们锁定了几个我们需要的文件和 xhr 文件。
很多网页的数据都会隐藏在json中。这可能是一样的吗?当然检查后失败了,然后我们看xhr,发现这个很熟悉的字段(当然我可能很熟悉)
显而易见的答案就在这里,只需解释一下
get historylist ,获取历史数据tk,我猜是万科的quantio语句(不知道这个词是不是拼错了,不过我用的很少,前后端相关的朋友可能知道) lemmald 这不是万科在百度的数字嘛,一看就知道是第七个页面大小,显示25条消息
这个发现很棒,解决了很多问题。
七、假的
作为爬虫,了解反爬虫套路是非常有必要的。如果你在xhr上进行正常爬虫,你会发现返回给你的是{error: xxxxx},此时你应该警惕,这证明你的机器人的身份被百度识破了,它拒绝了给你数据,所以我们需要做一些简单的伪装。前面已经讲过改头文件了,这次我会多讲。
1.headers 伪装,服务器使用它来确定您正在使用的浏览器。当出现这种情况时,服务器会认为这是来自浏览器的正常请求。2.Referer:浏览器使用它来确定您从哪个网页跳转。3.ip伪装,这个只要建好ip池就没有问题。建议去西刺代理检查一些需要的4.Cookie伪装,cookie是服务器用来识别你当前状态的,比如你登录了,什么,每次请求cookie从服务器,它将相应地更新。
最常用的就是上面这些了,从上到下越来越难调整了。面对百度,光改headers显然是不够的,于是加了Referer和cookie码(关键是两个月前就建立了。IP池已经废掉了,懒得整)。好了,到这里我们发现可以正常获取数据了。
八、文本匹配
不得不说,在解决了以上问题之后,文本匹配就变成了最简单的事情。
其实这是一种类似字典的格式,但是作者懒得想了,决定用一个简单粗暴的正则表达式。
九、转换时间戳
这时候我们就会发现,creattime给出的时间到底是什么鬼?但如果你仔细想想,你会发现它是一个时间戳
python 中的时间戳:自 1/1/1970 12:00AM 以来的秒数
是不是很破?幸运的是,解决这个问题只需要几段简短的代码
输入时间戳,好了,问题解决了。
十、绘图和csv
图片
CSV
十个一、总结和代码
感觉这次爬虫还行。两个多月后想起来也不容易。写这个博客纯粹是一个评论。至于怎么做图和怎么做csv的原因,我可以说博主是不是突然不想写了?
以下为代码:(注:博主懒得写评论了,不明白的可以评论提问,谢谢)
原创地址:%257b%2522重量%255fid%2522%253a%25226780366574501%2522%252℃%2522%252℃2522%2522%253a%25222014071 <4. pc%255pl%2522%257d&request_id = 6780366574501& biz_id = 0 & utm_medium。=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-12-80112434.pc_search_result_cache&utm_term=java%E7%88%AC%E8%99%AB 查看全部
动态网页抓取(爬取百度百科的历史记录,结果在时隔四个月之后再次遇到的对手)
动态页面爬取
很久没有写爬虫了。今天敲了一个爬虫——爬百度百科的历史记录。结果时隔四个月再次遇到的对手居然是动态页面(我一开始觉得百度太简单了。),但经过一番努力,还是达到了自己的目标,然后就写了博客作为评论。
一、概念
动态页面实际上是相对于静态页面的。面对静态页面时,直接查看响应一般是网页的整个代码,而动态页面则不然。一般来说,当再次打开动态页面的响应时,会与您在网页上看到的有所不同。
二、练习和练习前
因为我很喜欢练习,所以我会一言不发地练习,练习会给你真正的知识,你多练习就会明白。
目标网页:万科百度百科历史版本实现环境:win32版本:python3.6.2 实际目标:获取万科百度百科历史版本历史修改时间并制作图表或csv文件
三、流程说明
和所有爬虫一样,我们的第一步会是分析网页,因为我们的目标选择的是动态网页,所以我们还需要跟踪json文件等等。过程:
1、网页分析2、查询跟踪json等文件或xhr 3、文本匹配4、绘制或制作csv
四、工具准备
我们需要的库是(所有最新版本):
1.requests 2.re(以下库对于爬虫来说不是必需的,但它们是我这次需要的)3.matplotlib(用于可视化)4.datetime(用于时间操作)5.Pandas(python强大的数据处理库)6.os(系统操作)(我更喜欢原来的re库,当然这里用正则表达式可以解决所有问题)
你需要知道的:
1.python语法基础2.正则表达式匹配规则(以下不是爬虫必备)3.datetime一些基本功能4.matplotlib可视化操作(虽然这不是爬虫必须的,但很多情况下,数据可视化会让数据更直观,更容易做出判断)5.pandas库的基本使用(非爬虫必备,但数据分析必须学会)
五、网页分析
首先我们打开我们的目标页面→万科百度百科历史版。
好像一切正常,然后我们查看url,也有前面提到的规则,但是真的一切正常吗?
如果你把这个页面做为静态页面,那肯定是完蛋了,因为我一开始就是这样做的,当你在第一页查找代码时,你会发现一切正常,但是当你在第二页查找代码时page 有时,您会发现一个事实,即您在第二页甚至最后一页上看到的最后一个代码是相同的。你觉得这有悖常理吗?
六、关注
其实不然,这是很正常的事情,很多页面会被做成动态的,使用json或者其他文件传输数据(不准确,也可能使用java,javascript等代码调用端口等),这样就可以了更安全。这时候很多人会选择使用fiddle等第三方软件抓包,比较方便,但是这里笔者比较吃力,所以直接在控制器平台上观看即可。经过一番搜索,我们锁定了几个我们需要的文件和 xhr 文件。
很多网页的数据都会隐藏在json中。这可能是一样的吗?当然检查后失败了,然后我们看xhr,发现这个很熟悉的字段(当然我可能很熟悉)
显而易见的答案就在这里,只需解释一下
get historylist ,获取历史数据tk,我猜是万科的quantio语句(不知道这个词是不是拼错了,不过我用的很少,前后端相关的朋友可能知道) lemmald 这不是万科在百度的数字嘛,一看就知道是第七个页面大小,显示25条消息
这个发现很棒,解决了很多问题。
七、假的
作为爬虫,了解反爬虫套路是非常有必要的。如果你在xhr上进行正常爬虫,你会发现返回给你的是{error: xxxxx},此时你应该警惕,这证明你的机器人的身份被百度识破了,它拒绝了给你数据,所以我们需要做一些简单的伪装。前面已经讲过改头文件了,这次我会多讲。
1.headers 伪装,服务器使用它来确定您正在使用的浏览器。当出现这种情况时,服务器会认为这是来自浏览器的正常请求。2.Referer:浏览器使用它来确定您从哪个网页跳转。3.ip伪装,这个只要建好ip池就没有问题。建议去西刺代理检查一些需要的4.Cookie伪装,cookie是服务器用来识别你当前状态的,比如你登录了,什么,每次请求cookie从服务器,它将相应地更新。
最常用的就是上面这些了,从上到下越来越难调整了。面对百度,光改headers显然是不够的,于是加了Referer和cookie码(关键是两个月前就建立了。IP池已经废掉了,懒得整)。好了,到这里我们发现可以正常获取数据了。
八、文本匹配
不得不说,在解决了以上问题之后,文本匹配就变成了最简单的事情。
其实这是一种类似字典的格式,但是作者懒得想了,决定用一个简单粗暴的正则表达式。
九、转换时间戳
这时候我们就会发现,creattime给出的时间到底是什么鬼?但如果你仔细想想,你会发现它是一个时间戳
python 中的时间戳:自 1/1/1970 12:00AM 以来的秒数
是不是很破?幸运的是,解决这个问题只需要几段简短的代码
输入时间戳,好了,问题解决了。
十、绘图和csv
图片
CSV
十个一、总结和代码
感觉这次爬虫还行。两个多月后想起来也不容易。写这个博客纯粹是一个评论。至于怎么做图和怎么做csv的原因,我可以说博主是不是突然不想写了?
以下为代码:(注:博主懒得写评论了,不明白的可以评论提问,谢谢)
原创地址:%257b%2522重量%255fid%2522%253a%25226780366574501%2522%252℃%2522%252℃2522%2522%253a%25222014071 <4. pc%255pl%2522%257d&request_id = 6780366574501& biz_id = 0 & utm_medium。=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-12-80112434.pc_search_result_cache&utm_term=java%E7%88%AC%E8%99%AB
动态网页抓取(什么是动态URL动态页面的动态链接有什么特点)
网站优化 • 优采云 发表了文章 • 0 个评论 • 75 次浏览 • 2022-04-03 20:05
什么是动态网址
动态网址就是动态页面,动态链接是指带有“?”等参数符号的网址 在 URL 中并以 aspx、asp、jsp、php、perl 和 cgi 为后缀。
动态网址有什么特点
1、在构建反向链接的过程中,动态 URL 不如静态 URL 有利,因为它们不是永久性的。
2、动态 URL 对搜索引擎的好处不如静态 URL。
3、动态URL的生成是采集数据库的内容,所以无法保证网页内容的稳定性和链接的持久性,很难被搜索引擎 收录。
动态 URL 的优点
1、相同类型的网页使用相同的URL类型,只是调用参数不同。比如列表页和文章页,管理方便,可以知道网页的类型是列表页还是内容页。
2、动态URL中的参数可以提示搜索引擎。搜索引擎在抓取页面时更容易理解页面的主题,就像 URL 收录 关键词 一样。搜索引擎有能力识别后面的参数,这有利于网页的关键词排名。
3、网站物理结构变平了。所有网页使用同一个页面调用,页面最多有两级目录结构,方便管理,提高处理速度。
动态 URL 的缺点
1、动态网址相对传播难度较大,参数过多用户比较反感。在站点外传播时,用户信任度会低于静态 URL。
在搜索引擎中,动态 URL 的信任度也比静态 URL 略低,因为动态 URL 比静态 URL 更不稳定且更不稳定。
2、动态网址中的参数可能会导致搜索引擎蜘蛛死循环爬行,造成搜索引擎和服务器资源的巨大浪费。
搜索引擎一般对动态 URL 的信任度不够,所以很多动态 URL 的网页不可能是收录。
3、如果动态URL中的参数顺序颠倒,或者网页设置访问SessionID,这些相同的网页将被视为不同的页面。
会导致搜索引擎认为网站上存在大量重复内容,可能会影响收录和正常网页的排名,甚至会被误判。所以做SEO最好做静态URL。
本文的读者还可以阅读:
如何计算搜索引擎的质量网站
什么是搜索引擎优化?如何做好SEO?
如何从SEO角度选择一个好的域名
如何优化关键词? 查看全部
动态网页抓取(什么是动态URL动态页面的动态链接有什么特点)
什么是动态网址
动态网址就是动态页面,动态链接是指带有“?”等参数符号的网址 在 URL 中并以 aspx、asp、jsp、php、perl 和 cgi 为后缀。
动态网址有什么特点
1、在构建反向链接的过程中,动态 URL 不如静态 URL 有利,因为它们不是永久性的。
2、动态 URL 对搜索引擎的好处不如静态 URL。
3、动态URL的生成是采集数据库的内容,所以无法保证网页内容的稳定性和链接的持久性,很难被搜索引擎 收录。
动态 URL 的优点
1、相同类型的网页使用相同的URL类型,只是调用参数不同。比如列表页和文章页,管理方便,可以知道网页的类型是列表页还是内容页。
2、动态URL中的参数可以提示搜索引擎。搜索引擎在抓取页面时更容易理解页面的主题,就像 URL 收录 关键词 一样。搜索引擎有能力识别后面的参数,这有利于网页的关键词排名。
3、网站物理结构变平了。所有网页使用同一个页面调用,页面最多有两级目录结构,方便管理,提高处理速度。
动态 URL 的缺点
1、动态网址相对传播难度较大,参数过多用户比较反感。在站点外传播时,用户信任度会低于静态 URL。
在搜索引擎中,动态 URL 的信任度也比静态 URL 略低,因为动态 URL 比静态 URL 更不稳定且更不稳定。
2、动态网址中的参数可能会导致搜索引擎蜘蛛死循环爬行,造成搜索引擎和服务器资源的巨大浪费。
搜索引擎一般对动态 URL 的信任度不够,所以很多动态 URL 的网页不可能是收录。
3、如果动态URL中的参数顺序颠倒,或者网页设置访问SessionID,这些相同的网页将被视为不同的页面。
会导致搜索引擎认为网站上存在大量重复内容,可能会影响收录和正常网页的排名,甚至会被误判。所以做SEO最好做静态URL。
本文的读者还可以阅读:
如何计算搜索引擎的质量网站
什么是搜索引擎优化?如何做好SEO?
如何从SEO角度选择一个好的域名
如何优化关键词?
动态网页抓取(ASP、ASP.NET、PHP、JSP,哪个好?)
网站优化 • 优采云 发表了文章 • 0 个评论 • 72 次浏览 • 2022-04-03 20:03
目前动态网站开发主要有4种语言:ASP、ASP.NET、PHP、JSP。
1、ASP 代表 Active Server Pages,它是由 Microsoft 开发的超文本标记语言 (HTML)、脚本和 CGI(通用网关接口)的组合。它不提供自己专门的编程语言,但允许用户使用许多现有的脚本语言来编写 ASP 应用程序。ASP 编程比 HTML 更方便、更灵活。它运行在 Web 服务器端,然后将运行结果以 HTML 格式发送到客户端的浏览器。因此,ASP 比一般的脚本语言安全得多。
ASP最大的优点是可以收录HTML标签,也可以直接访问数据库,使用无限扩展的ActiveX控件,所以在编程上比HTML更方便、更灵活。通过使用ASP的组件和对象技术,用户可以直接使用ActiveX控件,调用对象方法和属性,以简单的方式实现强大的交互功能。
但是ASP技术也不是很完善。因为它基本上受限于微软的操作系统平台,主要的工作环境是微软的IIS应用程序结构,而且由于ActiveX对象具有平台特性,ASP技术不能轻易实现。在跨平台 Web 服务器上工作。
面向过程的程序开发方法使维护变得更加困难,特别是对于大型 ASP 应用程序。解释VBScript或JScript语言,使性能不能充分发挥。由于缺乏其基础设施,扩展性受到限制,虽然有COM组件可用,但在开发一些特殊功能(如文件上传)时,没有来自内置的支持,需要向第三方寻求控制控制供应商。
3、PHP 是超文本预处理器。它是当今 Internet 上最流行的脚本语言。它的语法借鉴了C、Java、PERL等语言,但只需要一点编程知识。可以使用 PHP 构建一个真正的交互式网站。
它对HTML语言有很好的兼容性,用户可以直接在脚本代码中添加HTML标签,或者在HTML标签中添加脚本代码,更好地实现页面控制。PHP提供标准的数据库接口,数据库连接方便,兼容性强;扩展性强;可以进行面向对象的编程。
4、JSP全称Java Server Pages(Java服务器页面),是1999年6月推出的一项新技术,是一种基于Java Servlet和整个Java(Java)系统的Web开发技术。
JSP和ASP在技术上有很多相似之处,但是来自不同的技术规范组织,所以ASP一般只用在Windows NT/2000平台上,而JSP可以运行在85%以上的服务器上,并且是基于JSP技术的应用程序比基于 ASP 的应用程序更易于维护和管理,因此被许多人认为是未来最有前途的动态 网站 技术。 查看全部
动态网页抓取(ASP、ASP.NET、PHP、JSP,哪个好?)
目前动态网站开发主要有4种语言:ASP、ASP.NET、PHP、JSP。
1、ASP 代表 Active Server Pages,它是由 Microsoft 开发的超文本标记语言 (HTML)、脚本和 CGI(通用网关接口)的组合。它不提供自己专门的编程语言,但允许用户使用许多现有的脚本语言来编写 ASP 应用程序。ASP 编程比 HTML 更方便、更灵活。它运行在 Web 服务器端,然后将运行结果以 HTML 格式发送到客户端的浏览器。因此,ASP 比一般的脚本语言安全得多。
ASP最大的优点是可以收录HTML标签,也可以直接访问数据库,使用无限扩展的ActiveX控件,所以在编程上比HTML更方便、更灵活。通过使用ASP的组件和对象技术,用户可以直接使用ActiveX控件,调用对象方法和属性,以简单的方式实现强大的交互功能。
但是ASP技术也不是很完善。因为它基本上受限于微软的操作系统平台,主要的工作环境是微软的IIS应用程序结构,而且由于ActiveX对象具有平台特性,ASP技术不能轻易实现。在跨平台 Web 服务器上工作。
面向过程的程序开发方法使维护变得更加困难,特别是对于大型 ASP 应用程序。解释VBScript或JScript语言,使性能不能充分发挥。由于缺乏其基础设施,扩展性受到限制,虽然有COM组件可用,但在开发一些特殊功能(如文件上传)时,没有来自内置的支持,需要向第三方寻求控制控制供应商。
3、PHP 是超文本预处理器。它是当今 Internet 上最流行的脚本语言。它的语法借鉴了C、Java、PERL等语言,但只需要一点编程知识。可以使用 PHP 构建一个真正的交互式网站。
它对HTML语言有很好的兼容性,用户可以直接在脚本代码中添加HTML标签,或者在HTML标签中添加脚本代码,更好地实现页面控制。PHP提供标准的数据库接口,数据库连接方便,兼容性强;扩展性强;可以进行面向对象的编程。
4、JSP全称Java Server Pages(Java服务器页面),是1999年6月推出的一项新技术,是一种基于Java Servlet和整个Java(Java)系统的Web开发技术。
JSP和ASP在技术上有很多相似之处,但是来自不同的技术规范组织,所以ASP一般只用在Windows NT/2000平台上,而JSP可以运行在85%以上的服务器上,并且是基于JSP技术的应用程序比基于 ASP 的应用程序更易于维护和管理,因此被许多人认为是未来最有前途的动态 网站 技术。
动态网页抓取(介绍使用BeautifulSoup抓取静态网页,使用Selenium-WebDriver抓取动态网页 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 81 次浏览 • 2022-04-03 19:12
)
介绍使用Beautiful Soup爬取静态网页和使用Selenium-WebDriver爬取动态网页
# 环境
import requests
# post body
body = {
"ck": '',
"area_code": "+86",
"number": "18797811992",
"analytics": "analytics_log"
}
# 请求头
headers = {
"Host": "accounts.douban.com",
"Origin": "https://accounts.douban.com",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
"Content-Type": "application/x-www-form-urlencoded",
"Referer": "https://accounts.douban.com/pa ... ot%3B,
"Accept-Language": "zh,en-US;q=0.9,en;q=0.8,zh-CN;q=0.7",
"Cache-Control": "no-cache",
"Connection": "keep-alive"
}
# URL参数
params = {
"k": "v",
"k2": "v2"
}
# 发送POST请求,设置请求方式,请求地址,请求体,请求头,请求参数,超时时间(单位为秒)
response = requests.post("https://accounts.douban.com/j/ ... ot%3B, data=body, headers=headers,
params=params, timeout=1)
# 相应的编码
print(response.encoding)
# 响应的状态
print(response.status_code)
# 响应的内容,根据头部字符编码进行解码
print(response.text)
# 响应的二进制形式,如读取文件
print(response.content)
# 将响应解析为json
print(response.json())
Beautiful Soup 是一个 Python 库,用于从 HTML 或 XML 文件中提取数据。它支持通过您最喜欢的转换器导航、查找和修改文档的惯用方式。Beautiful Soup 将为您节省数小时甚至数天的营业时间。
#爬虫演示#静态网络爬虫演示:
import requests
from bs4 import BeautifulSoup
# 请求URL
response = requests.get("http://www.santostang.com")
# 将响应传给bs4
bs = BeautifulSoup(response.text, "html.parser")
# 查找所有class为`article-list-1 clearfix`的article元素
article_list = bs.find_all("article", class_="article-list-1 clearfix")
# 将文本写入到csv文件中
with open("article_title.csv", "a") as article_file:
for article in article_list:
# 打印获取到的文本
title = article.header.h1.a.text
print(title)
# 写入
article_file.write(title + ",")
article_file.write("\n")
# 抓取动态网页
与静态网页相比,动态网页的内容不会出现在 HTML 源代码中。所以需要使用动态网页抓取技术:使用 Selenium-webDriver 模拟浏览器行为
Selenium 有许多功能,但其核心是一个用于 Web 浏览器自动化的工具集,它使用最好的技术来远程控制浏览器实例并模拟用户与浏览器的交互。
下载对应的驱动,根据浏览器和操作系统进行配置:
图像.png
网元
一个 WebElement 代表一个 DOM 元素。可以通过使用 WebDriver 实例从文档根节点搜索或通过在另一个 WebElement 下搜索来找到 WebElement。
WebDriver API 提供内置方法来根据不同的属性(例如 ID、名称、类、XPath、CSS 选择器、链接文本等)查找 WebElement。
from selenium.webdriver import Chrome
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
# 实例化驱动程序,并指定驱动程序地址(默认也会取PATH中配的值)
chrome_driver = Chrome(executable_path="/opt/WebDriver/bin/chromedriver")
try:
url = "http://www.baidu.com"
# 最大化窗口
chrome_driver.maximize_window()
# 打开网站
chrome_driver.get(url)
print("当前的URL为:" + chrome_driver.current_url)
# 等待DOM渲染完成
# WebDriverWait(chrome_driver).until()
# 获取input输入框元素
input_el = chrome_driver.find_element_by_id("kw")
# 在输入框输入文本
input_el.send_keys("Selenium WebDriver自动输入")
# 获取`百度一下`按钮
search_btn = chrome_driver.find_element_by_id("su")
# 模拟点击事件
search_btn.click()
# 这时候已经到另外一个页面了===========
# 搜索结果页的输入框
search_result = chrome_driver.find_element_by_id("kw")
# 清除数据
search_result.clear()
# 等待网页渲染完成,不然可能导致无法查询到想要获取的元素的异常
WebDriverWait(chrome_driver, 5, 0.2).until(EC.presence_of_all_elements_located((By.TAG_NAME, "a")))
WebDriverWait(chrome_driver, 5, 0.2).until(EC.presence_of_all_elements_located((By.ID, "1")))
# 第一条搜索结果
result_item_1 = chrome_driver.find_element_by_id("1")
a_link = result_item_1.find_element_by_tag_name("h3").find_element_by_tag_name("a")
# 根据a标签的href跳转到新的网页
a_link_href = a_link.get_property("href")
print("即将跳转的链接地址为:" + a_link_href)
chrome_driver.get(a_link_href)
# 刷新
chrome_driver.refresh()
# 屏幕截图
chrome_driver.save_screenshot("./屏幕截图.png")
finally:
# 退出浏览器
chrome_driver.quit() 查看全部
动态网页抓取(介绍使用BeautifulSoup抓取静态网页,使用Selenium-WebDriver抓取动态网页
)
介绍使用Beautiful Soup爬取静态网页和使用Selenium-WebDriver爬取动态网页
# 环境
import requests
# post body
body = {
"ck": '',
"area_code": "+86",
"number": "18797811992",
"analytics": "analytics_log"
}
# 请求头
headers = {
"Host": "accounts.douban.com",
"Origin": "https://accounts.douban.com",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
"Content-Type": "application/x-www-form-urlencoded",
"Referer": "https://accounts.douban.com/pa ... ot%3B,
"Accept-Language": "zh,en-US;q=0.9,en;q=0.8,zh-CN;q=0.7",
"Cache-Control": "no-cache",
"Connection": "keep-alive"
}
# URL参数
params = {
"k": "v",
"k2": "v2"
}
# 发送POST请求,设置请求方式,请求地址,请求体,请求头,请求参数,超时时间(单位为秒)
response = requests.post("https://accounts.douban.com/j/ ... ot%3B, data=body, headers=headers,
params=params, timeout=1)
# 相应的编码
print(response.encoding)
# 响应的状态
print(response.status_code)
# 响应的内容,根据头部字符编码进行解码
print(response.text)
# 响应的二进制形式,如读取文件
print(response.content)
# 将响应解析为json
print(response.json())
Beautiful Soup 是一个 Python 库,用于从 HTML 或 XML 文件中提取数据。它支持通过您最喜欢的转换器导航、查找和修改文档的惯用方式。Beautiful Soup 将为您节省数小时甚至数天的营业时间。
#爬虫演示#静态网络爬虫演示:
import requests
from bs4 import BeautifulSoup
# 请求URL
response = requests.get("http://www.santostang.com")
# 将响应传给bs4
bs = BeautifulSoup(response.text, "html.parser")
# 查找所有class为`article-list-1 clearfix`的article元素
article_list = bs.find_all("article", class_="article-list-1 clearfix")
# 将文本写入到csv文件中
with open("article_title.csv", "a") as article_file:
for article in article_list:
# 打印获取到的文本
title = article.header.h1.a.text
print(title)
# 写入
article_file.write(title + ",")
article_file.write("\n")
# 抓取动态网页
与静态网页相比,动态网页的内容不会出现在 HTML 源代码中。所以需要使用动态网页抓取技术:使用 Selenium-webDriver 模拟浏览器行为
Selenium 有许多功能,但其核心是一个用于 Web 浏览器自动化的工具集,它使用最好的技术来远程控制浏览器实例并模拟用户与浏览器的交互。
下载对应的驱动,根据浏览器和操作系统进行配置:

图像.png
网元
一个 WebElement 代表一个 DOM 元素。可以通过使用 WebDriver 实例从文档根节点搜索或通过在另一个 WebElement 下搜索来找到 WebElement。
WebDriver API 提供内置方法来根据不同的属性(例如 ID、名称、类、XPath、CSS 选择器、链接文本等)查找 WebElement。
from selenium.webdriver import Chrome
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
# 实例化驱动程序,并指定驱动程序地址(默认也会取PATH中配的值)
chrome_driver = Chrome(executable_path="/opt/WebDriver/bin/chromedriver")
try:
url = "http://www.baidu.com"
# 最大化窗口
chrome_driver.maximize_window()
# 打开网站
chrome_driver.get(url)
print("当前的URL为:" + chrome_driver.current_url)
# 等待DOM渲染完成
# WebDriverWait(chrome_driver).until()
# 获取input输入框元素
input_el = chrome_driver.find_element_by_id("kw")
# 在输入框输入文本
input_el.send_keys("Selenium WebDriver自动输入")
# 获取`百度一下`按钮
search_btn = chrome_driver.find_element_by_id("su")
# 模拟点击事件
search_btn.click()
# 这时候已经到另外一个页面了===========
# 搜索结果页的输入框
search_result = chrome_driver.find_element_by_id("kw")
# 清除数据
search_result.clear()
# 等待网页渲染完成,不然可能导致无法查询到想要获取的元素的异常
WebDriverWait(chrome_driver, 5, 0.2).until(EC.presence_of_all_elements_located((By.TAG_NAME, "a")))
WebDriverWait(chrome_driver, 5, 0.2).until(EC.presence_of_all_elements_located((By.ID, "1")))
# 第一条搜索结果
result_item_1 = chrome_driver.find_element_by_id("1")
a_link = result_item_1.find_element_by_tag_name("h3").find_element_by_tag_name("a")
# 根据a标签的href跳转到新的网页
a_link_href = a_link.get_property("href")
print("即将跳转的链接地址为:" + a_link_href)
chrome_driver.get(a_link_href)
# 刷新
chrome_driver.refresh()
# 屏幕截图
chrome_driver.save_screenshot("./屏幕截图.png")
finally:
# 退出浏览器
chrome_driver.quit()
动态网页抓取(爬虫的动态处理方法(我用较为简单的一些网址举例比如豆瓣的热门电影))
网站优化 • 优采云 发表了文章 • 0 个评论 • 79 次浏览 • 2022-04-03 19:10
前言
爬虫的动态处理方式(我以一些比较简单的网址为例,比如豆瓣的热门电影)
一、动态爬虫
动态爬虫和静态爬虫最大的区别在于源代码与网页内容不同。动态爬虫可以抓包(即直接使用浏览器的F12抓包获取相关文件)
二、使用步骤1.先通过网址找到你需要的
截图如下(示例):按F12进入开发者模式,第二步点击左上角刷新重新加载内容,第三步在红框中选择需要的内容,然后你可以使用“预览”查看是否对应
搜索无误后,在“Header”中找到“Request URL”和“User-Agent”。找到这些之后,基本的工作就差不多完成了。
2.代码段
先导入需要的库
代码显示如下:
import re
import urllib.request
import pandas as pd
这是我使用的一些库
url=('https://movie.douban.com/j/sea ... %2339;)
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36' }
requests=urllib.request.Request(url,headers=headers)
respon=urllib.request.urlopen(requests)
html=respon.read().decode('utf-8')
上面的代码是获取对应网页的内容
然后只需搜索您需要的内容。
3.完整代码
url=('https://movie.douban.com/j/sea ... %2339;)
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36' }
requests=urllib.request.Request(url,headers=headers)
respon=urllib.request.urlopen(requests)
html=respon.read().decode('utf-8')
photo=re.compile(r'"cover":"(.*?),"id"')
list1=re.findall(photo,html)
name=re.compile(r'"title":"(.*?)",')
list2=re.findall(name,html)
# print(html)
rat=re.compile(r'"rate":"(.*?),')
list3=re.findall(rat,html)
xx={'电影名':list2,'评分':list3}
df=pd.DataFrame(xx,index=range(1,51))
print(df)
总结
以上就是我今天要讲的内容。本文仅简单介绍动态爬虫的方法。我希望它会有所帮助。 查看全部
动态网页抓取(爬虫的动态处理方法(我用较为简单的一些网址举例比如豆瓣的热门电影))
前言
爬虫的动态处理方式(我以一些比较简单的网址为例,比如豆瓣的热门电影)
一、动态爬虫
动态爬虫和静态爬虫最大的区别在于源代码与网页内容不同。动态爬虫可以抓包(即直接使用浏览器的F12抓包获取相关文件)
二、使用步骤1.先通过网址找到你需要的

截图如下(示例):按F12进入开发者模式,第二步点击左上角刷新重新加载内容,第三步在红框中选择需要的内容,然后你可以使用“预览”查看是否对应

搜索无误后,在“Header”中找到“Request URL”和“User-Agent”。找到这些之后,基本的工作就差不多完成了。
2.代码段
先导入需要的库
代码显示如下:
import re
import urllib.request
import pandas as pd
这是我使用的一些库
url=('https://movie.douban.com/j/sea ... %2339;)
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36' }
requests=urllib.request.Request(url,headers=headers)
respon=urllib.request.urlopen(requests)
html=respon.read().decode('utf-8')
上面的代码是获取对应网页的内容
然后只需搜索您需要的内容。
3.完整代码
url=('https://movie.douban.com/j/sea ... %2339;)
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36' }
requests=urllib.request.Request(url,headers=headers)
respon=urllib.request.urlopen(requests)
html=respon.read().decode('utf-8')
photo=re.compile(r'"cover":"(.*?),"id"')
list1=re.findall(photo,html)
name=re.compile(r'"title":"(.*?)",')
list2=re.findall(name,html)
# print(html)
rat=re.compile(r'"rate":"(.*?),')
list3=re.findall(rat,html)
xx={'电影名':list2,'评分':list3}
df=pd.DataFrame(xx,index=range(1,51))
print(df)
总结
以上就是我今天要讲的内容。本文仅简单介绍动态爬虫的方法。我希望它会有所帮助。
动态网页抓取(动态抓取在开始动态网页之前吗,我们还需要了解 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2022-04-01 09:26
)
动态爬取
在开始爬取动态网页之前,我们还需要了解一个更新的技术——AJAX(Asynchronous Javascript And XML)。它的价值在于可以通过在后台与服务器交换少量数据来异步更新网页。这意味着可以在不重新加载整个页面的情况下更新页面的某些部分。一方面减少了网页重复内容的下载,另一方面节省了流量,因此得到了广泛的应用。
如果使用AJAX加载动态网页,如何抓取里面动态加载的内容?有两种方法:
(1)通过浏览器检查元素解析地址
(2) 模拟浏览器通过 selenium 爬行
#使用selenium打开浏览器和一个网页
from selenium import webdriver
driver=webdriver.Firefox()
driver.get("http://www.dianping.com/search ... 6quot;)
使用 json 库
从 json 数据中提取注释,上面的结果相当混乱。其实这些都是json数据。我们可以使用 json 库来解析数据并从中提取所需的数据。
import json
json_data=json.loads(r.text) #使用jison.loads把字符串格式得响应体数据转化为json数据。
comment_list=json_data['data']['comments'] #利用接送数据得 结构提取评论的列表comment_list
for eachone in comment_list: #最后用for循环提取其中得评论文本
message=comment_list[eachone]['content']
print(message) 查看全部
动态网页抓取(动态抓取在开始动态网页之前吗,我们还需要了解
)
动态爬取
在开始爬取动态网页之前,我们还需要了解一个更新的技术——AJAX(Asynchronous Javascript And XML)。它的价值在于可以通过在后台与服务器交换少量数据来异步更新网页。这意味着可以在不重新加载整个页面的情况下更新页面的某些部分。一方面减少了网页重复内容的下载,另一方面节省了流量,因此得到了广泛的应用。
如果使用AJAX加载动态网页,如何抓取里面动态加载的内容?有两种方法:
(1)通过浏览器检查元素解析地址
(2) 模拟浏览器通过 selenium 爬行
#使用selenium打开浏览器和一个网页
from selenium import webdriver
driver=webdriver.Firefox()
driver.get("http://www.dianping.com/search ... 6quot;)
使用 json 库
从 json 数据中提取注释,上面的结果相当混乱。其实这些都是json数据。我们可以使用 json 库来解析数据并从中提取所需的数据。
import json
json_data=json.loads(r.text) #使用jison.loads把字符串格式得响应体数据转化为json数据。
comment_list=json_data['data']['comments'] #利用接送数据得 结构提取评论的列表comment_list
for eachone in comment_list: #最后用for循环提取其中得评论文本
message=comment_list[eachone]['content']
print(message)
动态网页抓取(IP地址是一种32位二进制数的地址,你知道吗?)
网站优化 • 优采云 发表了文章 • 0 个评论 • 56 次浏览 • 2022-03-31 15:01
IP 地址是一个 32 位二进制数地址,理论上大约有 40 亿(2 的 32 次方)可能的地址组合,这似乎是一个很大的地址空间。实际上,根据网络ID和主机ID的不同位规则,IP地址可以分为A(8位网络ID和24位主机ID)、B(16位网络ID和16位主机ID) ), C (24-bit network ID and 16-bit host ID) 由于历史原因和技术发展的差异,A类地址和B类地址几乎被完全分配,只有C类地址可以被周围的组织分配世界。所以IP地址是非常重要的网络资源。
对于已经建立互联网服务的机构,由于其主机开通了WWW、FTP、E-mail等访问服务,通常会公布一个固定的IP地址,方便用户访问。当然,数字IP不方便记忆和识别,人们更习惯通过域名访问主机,而域名仍然需要通过域名服务器(DNS)翻译成IP地址。比如你的主页地址很容易被用户记住和使用,域名服务器会将这个域名翻译成101.12.123.234,即您的在线形象的真实地址。
对于大多数拨号上网的用户来说,由于上网的时间和空间的离散性,给每个用户分配一个固定的IP地址(静态IP)是非常不可取的,这样会造成IP地址资源的极大浪费。因此,这些用户通常在拨打 ISP 的主机后会自动获得一个动态 IP 地址。当然,地址不是任意的,而是ISP申请的网络ID和主机ID合法范围内的地址。拨号用户的IP地址在任意两次连接中都可能不同,但每次连接时IP地址都保持不变。 查看全部
动态网页抓取(IP地址是一种32位二进制数的地址,你知道吗?)
IP 地址是一个 32 位二进制数地址,理论上大约有 40 亿(2 的 32 次方)可能的地址组合,这似乎是一个很大的地址空间。实际上,根据网络ID和主机ID的不同位规则,IP地址可以分为A(8位网络ID和24位主机ID)、B(16位网络ID和16位主机ID) ), C (24-bit network ID and 16-bit host ID) 由于历史原因和技术发展的差异,A类地址和B类地址几乎被完全分配,只有C类地址可以被周围的组织分配世界。所以IP地址是非常重要的网络资源。
对于已经建立互联网服务的机构,由于其主机开通了WWW、FTP、E-mail等访问服务,通常会公布一个固定的IP地址,方便用户访问。当然,数字IP不方便记忆和识别,人们更习惯通过域名访问主机,而域名仍然需要通过域名服务器(DNS)翻译成IP地址。比如你的主页地址很容易被用户记住和使用,域名服务器会将这个域名翻译成101.12.123.234,即您的在线形象的真实地址。
对于大多数拨号上网的用户来说,由于上网的时间和空间的离散性,给每个用户分配一个固定的IP地址(静态IP)是非常不可取的,这样会造成IP地址资源的极大浪费。因此,这些用户通常在拨打 ISP 的主机后会自动获得一个动态 IP 地址。当然,地址不是任意的,而是ISP申请的网络ID和主机ID合法范围内的地址。拨号用户的IP地址在任意两次连接中都可能不同,但每次连接时IP地址都保持不变。
动态网页抓取(【每日一题】代码中没有使用“下滑到页面底部” )
网站优化 • 优采云 发表了文章 • 0 个评论 • 57 次浏览 • 2022-03-31 02:11
)
代码中没有使用“滑动到页面底部”动作,即没有:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
这不会影响网页内容的抓取。
因为原书有这行代码,解析完iframe后,这行代码就不能用了,所以使用driver.switch_to.default_content()切换回原来未解析的iframe。
但是下面的代码中没有向下滑动的操作,所以不需要同时切换回iframe的代码。
<p> 1 from selenium import webdriver
2 import time
3
4 driver = webdriver.Chrome(executable_path = r'D:\Anaconda\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe')
5 driver.get("http://www.santostang.com/2018 ... 6quot;)
6
7 j=0
8 driver.switch_to.frame(driver.find_element_by_css_selector('iframe[title="livere-comment"]'))
9 driver.implicitly_wait(30)
10 while True:
11
12 #buttons为list类型,获取一屏中页面数量
13 buttons = driver.find_elements_by_css_selector('button.page-btn')
14 bSize = len(buttons)
15
16 for i in range(0,bSize):
17 #打开文件
18 file = open(r'C:\Users\rumin\Desktop\comment.txt','a+')
19 file.write('\n')
20 file.write('=====================第%d页评论========================\n'%(i+1+j*10))
21
22 #找到当前页所有comments
23 comments = driver.find_elements_by_css_selector('div.reply-content')
24 for item in comments:
25 comment = item.find_element_by_tag_name('p')
26 print(comment.text)
27 text = comment.text.encode('GBK', 'ignore').decode('GBk')
28 file.write(text+'\n')
29 time.sleep(2)
30 file.close()
31
32 if i 查看全部
动态网页抓取(【每日一题】代码中没有使用“下滑到页面底部”
)
代码中没有使用“滑动到页面底部”动作,即没有:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
这不会影响网页内容的抓取。
因为原书有这行代码,解析完iframe后,这行代码就不能用了,所以使用driver.switch_to.default_content()切换回原来未解析的iframe。
但是下面的代码中没有向下滑动的操作,所以不需要同时切换回iframe的代码。
<p> 1 from selenium import webdriver
2 import time
3
4 driver = webdriver.Chrome(executable_path = r'D:\Anaconda\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe')
5 driver.get("http://www.santostang.com/2018 ... 6quot;)
6
7 j=0
8 driver.switch_to.frame(driver.find_element_by_css_selector('iframe[title="livere-comment"]'))
9 driver.implicitly_wait(30)
10 while True:
11
12 #buttons为list类型,获取一屏中页面数量
13 buttons = driver.find_elements_by_css_selector('button.page-btn')
14 bSize = len(buttons)
15
16 for i in range(0,bSize):
17 #打开文件
18 file = open(r'C:\Users\rumin\Desktop\comment.txt','a+')
19 file.write('\n')
20 file.write('=====================第%d页评论========================\n'%(i+1+j*10))
21
22 #找到当前页所有comments
23 comments = driver.find_elements_by_css_selector('div.reply-content')
24 for item in comments:
25 comment = item.find_element_by_tag_name('p')
26 print(comment.text)
27 text = comment.text.encode('GBK', 'ignore').decode('GBk')
28 file.write(text+'\n')
29 time.sleep(2)
30 file.close()
31
32 if i
动态网页抓取(东莞网站优化如何更好的被百度蜘蛛抓取呢??)
网站优化 • 优采云 发表了文章 • 0 个评论 • 70 次浏览 • 2022-03-29 17:03
东莞网站优化如果你想让你的网站的更多页面是收录,你必须先让网页被百度蜘蛛抓取,可以收录我们先不说了,你得抢了才可以跟进收录。那么网站如何更好的被百度蜘蛛抓取?
1、保证网站高质量原创:网站的原创很重要,蜘蛛要爬很多网站一天,如果你的网站都是采集的东西,对它来说没有任何意义,这样的网站不仅招不到蜘蛛,更招不到用户。
2、保证网站的更新频率:新站点一上线,就会开始向网站添加原创内容。很多站长觉得新站上线了,网站没有内容,能不能一天加几十个文章到网站,这样搜索引擎就多了收录,新站会不会推出搜索引擎收录还是一样的,加这么多内容也没关系原创,要不是原创搜索引擎会想这样的 网站采集 网站没有新想法。
还有一点需要考虑,现在一天可以添加这么多内容,蜘蛛习惯了你网站每天添加这么多内容,当你一天不添加更多内容时,蜘蛛来找你网站吃不下可能会出现快照没有更新的情况,查看网站日志看看蜘蛛什么时候会来网站,确保网站有不错的更新频率,这样网站为了更好的吸引蜘蛛去抢。
3、保证网站有一个明确的关键词:蜘蛛来网站主要是通过网站关键词,站长经常是不可能的让蜘蛛清楚地知道这个 网站 的主要 关键词 是主要 关键词 的那个人。不能判断的蜘蛛不会给网站很高的权重,关键词的排名也不行。
所以为了吸引蜘蛛爬行网站,最后要确认关键词对于网站,网站的标题和描述要写清楚,并且同时在同一篇文章文章中网站的内链构造中,不要使用不同的关键词指向同一个页面,这样的内链构造是错误的。同时,首页的标题和内页的标题不能设置相同。主页设置为主关键词,内页标题设置为与文章关键词的标题相关,这样方便蜘蛛判断内页。页面也会赋予内页权重,因此吸引蜘蛛应该以明确的 关键词 开头。 查看全部
动态网页抓取(东莞网站优化如何更好的被百度蜘蛛抓取呢??)
东莞网站优化如果你想让你的网站的更多页面是收录,你必须先让网页被百度蜘蛛抓取,可以收录我们先不说了,你得抢了才可以跟进收录。那么网站如何更好的被百度蜘蛛抓取?
1、保证网站高质量原创:网站的原创很重要,蜘蛛要爬很多网站一天,如果你的网站都是采集的东西,对它来说没有任何意义,这样的网站不仅招不到蜘蛛,更招不到用户。
2、保证网站的更新频率:新站点一上线,就会开始向网站添加原创内容。很多站长觉得新站上线了,网站没有内容,能不能一天加几十个文章到网站,这样搜索引擎就多了收录,新站会不会推出搜索引擎收录还是一样的,加这么多内容也没关系原创,要不是原创搜索引擎会想这样的 网站采集 网站没有新想法。
还有一点需要考虑,现在一天可以添加这么多内容,蜘蛛习惯了你网站每天添加这么多内容,当你一天不添加更多内容时,蜘蛛来找你网站吃不下可能会出现快照没有更新的情况,查看网站日志看看蜘蛛什么时候会来网站,确保网站有不错的更新频率,这样网站为了更好的吸引蜘蛛去抢。
3、保证网站有一个明确的关键词:蜘蛛来网站主要是通过网站关键词,站长经常是不可能的让蜘蛛清楚地知道这个 网站 的主要 关键词 是主要 关键词 的那个人。不能判断的蜘蛛不会给网站很高的权重,关键词的排名也不行。
所以为了吸引蜘蛛爬行网站,最后要确认关键词对于网站,网站的标题和描述要写清楚,并且同时在同一篇文章文章中网站的内链构造中,不要使用不同的关键词指向同一个页面,这样的内链构造是错误的。同时,首页的标题和内页的标题不能设置相同。主页设置为主关键词,内页标题设置为与文章关键词的标题相关,这样方便蜘蛛判断内页。页面也会赋予内页权重,因此吸引蜘蛛应该以明确的 关键词 开头。
动态网页抓取( 网络营销教学网站将动态网页检索的一般特点简要:)
网站优化 • 优采云 发表了文章 • 0 个评论 • 74 次浏览 • 2022-03-29 05:16
网络营销教学网站将动态网页检索的一般特点简要:)
什么是动态网页和静态网页?
动态网页对应的是静态网页,也就是说网页网址的后缀并不是.等静态网页的常见形式。Perl、.cgi等形式都是后缀,还有一个标志性的符号——“?” 在动态网页 URL 中。如果有这样的动态网页,地址是:
这是一个典型的动态网页 URL 表单。
这里所说的动态网页与网页上的各种动画、滚动字幕等视觉“动态效果”没有直接关系。动态网页也可以是纯文本内容或收录各种动画。这些只是网页具体内容的呈现形式,无论网页是否具有动态效果,采用动态网站技术生成的网页都称为动态网页。
从网站查看者的角度来看,无论是动态网页还是静态网页,都可以展示基本的文字和图片信息,但从网站开发、管理、维护的角度来看,却是非常很难有大的区别。网络营销教学网站简单总结动态网页的一般特点如下:
(1)动态网页基于数据库技术,可以大大减少网站维护的工作量;
(2)网站使用动态web技术可以实现更多功能,如用户注册、用户登录、在线调查、用户管理、订单管理等;
(3)动态网页实际上并不是服务器上独立存在的网页文件,服务器只有在用户请求时才返回完整的网页;
(4)动态网页中的“?”对于搜索引擎检索有一定的问题,一般搜索引擎不可能从一个网站数据库中访问所有网页,或者出于技术考虑,搜索蜘蛛不会抓取URL中“?”后面的内容,所以使用动态网页的网站在推广搜索引擎时需要做一定的技术处理,以满足搜索引擎的要求。 查看全部
动态网页抓取(
网络营销教学网站将动态网页检索的一般特点简要:)
什么是动态网页和静态网页?
动态网页对应的是静态网页,也就是说网页网址的后缀并不是.等静态网页的常见形式。Perl、.cgi等形式都是后缀,还有一个标志性的符号——“?” 在动态网页 URL 中。如果有这样的动态网页,地址是:
这是一个典型的动态网页 URL 表单。
这里所说的动态网页与网页上的各种动画、滚动字幕等视觉“动态效果”没有直接关系。动态网页也可以是纯文本内容或收录各种动画。这些只是网页具体内容的呈现形式,无论网页是否具有动态效果,采用动态网站技术生成的网页都称为动态网页。
从网站查看者的角度来看,无论是动态网页还是静态网页,都可以展示基本的文字和图片信息,但从网站开发、管理、维护的角度来看,却是非常很难有大的区别。网络营销教学网站简单总结动态网页的一般特点如下:
(1)动态网页基于数据库技术,可以大大减少网站维护的工作量;
(2)网站使用动态web技术可以实现更多功能,如用户注册、用户登录、在线调查、用户管理、订单管理等;
(3)动态网页实际上并不是服务器上独立存在的网页文件,服务器只有在用户请求时才返回完整的网页;
(4)动态网页中的“?”对于搜索引擎检索有一定的问题,一般搜索引擎不可能从一个网站数据库中访问所有网页,或者出于技术考虑,搜索蜘蛛不会抓取URL中“?”后面的内容,所以使用动态网页的网站在推广搜索引擎时需要做一定的技术处理,以满足搜索引擎的要求。
动态网页抓取(动态页面的网站搜索引擎抓取就慢了吗?懂技术的都知道)
网站优化 • 优采云 发表了文章 • 0 个评论 • 48 次浏览 • 2022-03-29 05:15
每个人都说静态页面对 SEO 更友好?网站 搜索引擎对动态页面的抓取速度是否缓慢?
其实不,懂技术的人都知道。搜索引擎通过爬虫来爬取互联网上的页面。对于一个网站,有可能在搜索引擎到达你的站点后,搜索引擎会继续在网站中爬取,那么搜索引擎当然会继续爬取上的静态html文件服务器。但不要忘记搜索引擎的工作原理,它依赖互联网上的地址进行不断的爬取。也就是说,即使你使用动态页面,它仍然会根据你在网站上的情况进行爬取。例如,你有几个新闻更新,类似于 news.php?tid=1,2,3 等等。然后爬虫会根据这些链接对页面进行爬取,所以动态页面搜索引擎也会继续对页面进行爬取。
那么既然可以被搜索引擎抓取,为什么人们还提倡把所有的网站都设为静态。这实际上与搜索引擎优化有关。我们都知道,当页面是静态的时候,访问的时候直接获取页面结果。动态页面也需要向数据库发起请求,数据库开始根据条件返回相应的数据。这给了用户等待的时间。毕竟,从数据库中请求数据也需要资源。其次,搜索引擎对快速打开的页面具有排名靠前的算法。毕竟,让用户等待很长时间才能获得相同的页面并不是很友好。所以,这个静态页面还是更有利于搜索引擎的排名。
现在大家都知道了。如果您可以将 网站 设为静态,请尝试将 网站 设为静态。毕竟打开速度会更快,对排名也有好处。这是两全其美的。 查看全部
动态网页抓取(动态页面的网站搜索引擎抓取就慢了吗?懂技术的都知道)
每个人都说静态页面对 SEO 更友好?网站 搜索引擎对动态页面的抓取速度是否缓慢?

其实不,懂技术的人都知道。搜索引擎通过爬虫来爬取互联网上的页面。对于一个网站,有可能在搜索引擎到达你的站点后,搜索引擎会继续在网站中爬取,那么搜索引擎当然会继续爬取上的静态html文件服务器。但不要忘记搜索引擎的工作原理,它依赖互联网上的地址进行不断的爬取。也就是说,即使你使用动态页面,它仍然会根据你在网站上的情况进行爬取。例如,你有几个新闻更新,类似于 news.php?tid=1,2,3 等等。然后爬虫会根据这些链接对页面进行爬取,所以动态页面搜索引擎也会继续对页面进行爬取。
那么既然可以被搜索引擎抓取,为什么人们还提倡把所有的网站都设为静态。这实际上与搜索引擎优化有关。我们都知道,当页面是静态的时候,访问的时候直接获取页面结果。动态页面也需要向数据库发起请求,数据库开始根据条件返回相应的数据。这给了用户等待的时间。毕竟,从数据库中请求数据也需要资源。其次,搜索引擎对快速打开的页面具有排名靠前的算法。毕竟,让用户等待很长时间才能获得相同的页面并不是很友好。所以,这个静态页面还是更有利于搜索引擎的排名。
现在大家都知道了。如果您可以将 网站 设为静态,请尝试将 网站 设为静态。毕竟打开速度会更快,对排名也有好处。这是两全其美的。
动态网页抓取(2019独角兽企业重金招聘Python工程师标准(gt)(图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 64 次浏览 • 2022-03-29 03:27
2019独角兽企业招聘Python工程师标准>>>
1 简介
在 Python 网络爬虫内容提取器一文中,我们详细讲解了核心组件:可插拔内容提取器类 gsExtractor。本文记录了在确定gsExtractor技术路线过程中所做的编程实验。这是第二部分。第一部分实验用xslt方法提取静态网页内容,一次性转换成xml格式。一个问题仍然存在:如何提取由 javascript 管理的动态内容?那么这篇文章就回答了这个问题。
2. 动态内容提取技术组件
上一篇python使用xslt提取网页数据,要提取的内容是直接从网页的源码中获取的。但是有些Ajax动态内容在源代码中是找不到的,所以需要找到合适的程序库来加载异步或者动态加载的内容,交给本项目的抽取器进行抽取。
Python可以使用selenium来执行javascript,而selenium可以让浏览器自动加载页面并获取需要的数据。Selenium 没有自己的浏览器,可以使用第三方浏览器如 Firefox、Chrome 等,也可以使用 PhantomJS 等无头浏览器在后台执行。
三、源码及实验过程
假设我们要抓取京东手机页面的手机名称和价格(网页源码中找不到价格),如下图:
Step 1:利用吉搜科谋数个单元直观的标注功能,可以非常快速的自动生成调试好的抓取规则。其实就是一个标准的xslt程序,如下图,将生成的xslt程序复制到程序中的下面。注:本文仅记录实验过程。在实际系统中,将使用各种方法将 xslt 程序注入到内容提取器中。
第二步:执行如下代码(windows10下测试通过,python3.2),请注意:xslt是一个比较长的字符串,如果删除这个字符串,代码只有几行,足够看到 Python 的强大
#/usr/bin/python
from urllib import request
from lxml import etree
from selenium import webdriver
import time
# 京东手机商品页面
url = "http://item.jd.com/1312640.html"
# 下面的xslt是通过集搜客的谋数台图形界面自动生成的
xslt_root = etree.XML("""\
""")
# 使用webdriver.PhantomJS
browser = webdriver.PhantomJS(executable_path='C:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe')
browser.get(url)
time.sleep(3)
transform = etree.XSLT(xslt_root)
# 执行js得到整个dom
html = browser.execute_script("return document.documentElement.outerHTML")
doc = etree.HTML(html)
# 用xslt从dom中提取需要的字段
result_tree = transform(doc)
print(result_tree)
第三步:如下图所示,网页中的手机名称和价格被正确抓取
4. 继续阅读
至此,我们通过两篇文章文章演示了如何抓取静态和动态网页内容,均使用xslt一次性从网页中提取出需要的内容。事实上,xslt 是一种相对复杂的编程语言。如果你手动写xslt,那么最好写成离散的xpath。如果这个xslt不是手工写的,而是程序自动生成的,那是有道理的,程序员也不再需要花时间编写和调试抓取规则,这是一项非常耗时耗力的工作。下一篇《1分钟快速生成网页内容提取的xslt》将介绍如何生成xslt。
5. Jisouke GooSeeker开源代码下载源
1.GooSeeker开源Python网络爬虫GitHub源码
6.文档修改历史
2016-05-26:V2.0,添加文字说明
2016-05-29:V2.1,增加第5章:源码下载源码,并替换github源码的URL 查看全部
动态网页抓取(2019独角兽企业重金招聘Python工程师标准(gt)(图))
2019独角兽企业招聘Python工程师标准>>>


1 简介
在 Python 网络爬虫内容提取器一文中,我们详细讲解了核心组件:可插拔内容提取器类 gsExtractor。本文记录了在确定gsExtractor技术路线过程中所做的编程实验。这是第二部分。第一部分实验用xslt方法提取静态网页内容,一次性转换成xml格式。一个问题仍然存在:如何提取由 javascript 管理的动态内容?那么这篇文章就回答了这个问题。
2. 动态内容提取技术组件
上一篇python使用xslt提取网页数据,要提取的内容是直接从网页的源码中获取的。但是有些Ajax动态内容在源代码中是找不到的,所以需要找到合适的程序库来加载异步或者动态加载的内容,交给本项目的抽取器进行抽取。
Python可以使用selenium来执行javascript,而selenium可以让浏览器自动加载页面并获取需要的数据。Selenium 没有自己的浏览器,可以使用第三方浏览器如 Firefox、Chrome 等,也可以使用 PhantomJS 等无头浏览器在后台执行。
三、源码及实验过程
假设我们要抓取京东手机页面的手机名称和价格(网页源码中找不到价格),如下图:

Step 1:利用吉搜科谋数个单元直观的标注功能,可以非常快速的自动生成调试好的抓取规则。其实就是一个标准的xslt程序,如下图,将生成的xslt程序复制到程序中的下面。注:本文仅记录实验过程。在实际系统中,将使用各种方法将 xslt 程序注入到内容提取器中。

第二步:执行如下代码(windows10下测试通过,python3.2),请注意:xslt是一个比较长的字符串,如果删除这个字符串,代码只有几行,足够看到 Python 的强大
#/usr/bin/python
from urllib import request
from lxml import etree
from selenium import webdriver
import time
# 京东手机商品页面
url = "http://item.jd.com/1312640.html"
# 下面的xslt是通过集搜客的谋数台图形界面自动生成的
xslt_root = etree.XML("""\
""")
# 使用webdriver.PhantomJS
browser = webdriver.PhantomJS(executable_path='C:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe')
browser.get(url)
time.sleep(3)
transform = etree.XSLT(xslt_root)
# 执行js得到整个dom
html = browser.execute_script("return document.documentElement.outerHTML")
doc = etree.HTML(html)
# 用xslt从dom中提取需要的字段
result_tree = transform(doc)
print(result_tree)
第三步:如下图所示,网页中的手机名称和价格被正确抓取

4. 继续阅读
至此,我们通过两篇文章文章演示了如何抓取静态和动态网页内容,均使用xslt一次性从网页中提取出需要的内容。事实上,xslt 是一种相对复杂的编程语言。如果你手动写xslt,那么最好写成离散的xpath。如果这个xslt不是手工写的,而是程序自动生成的,那是有道理的,程序员也不再需要花时间编写和调试抓取规则,这是一项非常耗时耗力的工作。下一篇《1分钟快速生成网页内容提取的xslt》将介绍如何生成xslt。
5. Jisouke GooSeeker开源代码下载源
1.GooSeeker开源Python网络爬虫GitHub源码
6.文档修改历史
2016-05-26:V2.0,添加文字说明
2016-05-29:V2.1,增加第5章:源码下载源码,并替换github源码的URL
动态网页抓取(动态网页抓取有两种方式可以考虑:如何让服务器不受影响)
网站优化 • 优采云 发表了文章 • 0 个评论 • 51 次浏览 • 2022-03-24 18:01
动态网页抓取有两种方式可以考虑:1.原生动态网页抓取https即http协议原生返回给浏览器。抓取时,推荐使用抓包工具,比如:awk或者python内置库pyspider。2.restful动态网页抓取rest风格是一种对传统http协议(post请求)的模拟与封装。用户传递给服务器的参数是以字符串形式的数据传递,但是由于post方式无法传递链接参数,所以网站设计人员会采用其他http协议方式返回数据。
如图所示:这种方式在http协议基础上根据抓取的用户方式不同,用户端与服务器通过一定的协议链接数来传递数据,如用户可以自定义的结构化传递数据。这种实现的特点是:可以将数据安全传递给web服务器。这种实现非常容易实现,但是在参数的处理上稍微麻烦点,代码耦合性也高。
https简单说就是http协议的安全升级版。所以可以用网页抓包工具实现。
https提供ssl协议,能够防止数据被篡改。但是依然存在可以被窃取的隐患。比如知乎上就有过类似的漏洞,抓包工具能被抓取。如何让服务器不受影响的情况下,抓取数据的话,就是利用session可以来实现对服务器中的数据进行会话控制。但是session也是存在有一定的可能被嗅探,泄露数据的风险。此外,session会有个不定期的频率刷新,保证数据都不会被修改,这就意味着session无法防止注入。
但是,既然你说是静态的网页,通常是在iframe中放置返回text,也能够保证不会进行其他暴力破解。如果有想法,可以去爬一些小网站去研究下。如果想去看视频,可以到找个自动化爬虫工具,把站点访问计划给打好,然后自己跑流程...最后题主要注意安全,最安全的策略就是不要随便用非本地机器来爬,如果用后台服务器不方便做黑产,可以考虑sqlmap,写一个通用的sqlmap工具,对视频页面也可以的,主要是抓数据。 查看全部
动态网页抓取(动态网页抓取有两种方式可以考虑:如何让服务器不受影响)
动态网页抓取有两种方式可以考虑:1.原生动态网页抓取https即http协议原生返回给浏览器。抓取时,推荐使用抓包工具,比如:awk或者python内置库pyspider。2.restful动态网页抓取rest风格是一种对传统http协议(post请求)的模拟与封装。用户传递给服务器的参数是以字符串形式的数据传递,但是由于post方式无法传递链接参数,所以网站设计人员会采用其他http协议方式返回数据。
如图所示:这种方式在http协议基础上根据抓取的用户方式不同,用户端与服务器通过一定的协议链接数来传递数据,如用户可以自定义的结构化传递数据。这种实现的特点是:可以将数据安全传递给web服务器。这种实现非常容易实现,但是在参数的处理上稍微麻烦点,代码耦合性也高。
https简单说就是http协议的安全升级版。所以可以用网页抓包工具实现。
https提供ssl协议,能够防止数据被篡改。但是依然存在可以被窃取的隐患。比如知乎上就有过类似的漏洞,抓包工具能被抓取。如何让服务器不受影响的情况下,抓取数据的话,就是利用session可以来实现对服务器中的数据进行会话控制。但是session也是存在有一定的可能被嗅探,泄露数据的风险。此外,session会有个不定期的频率刷新,保证数据都不会被修改,这就意味着session无法防止注入。
但是,既然你说是静态的网页,通常是在iframe中放置返回text,也能够保证不会进行其他暴力破解。如果有想法,可以去爬一些小网站去研究下。如果想去看视频,可以到找个自动化爬虫工具,把站点访问计划给打好,然后自己跑流程...最后题主要注意安全,最安全的策略就是不要随便用非本地机器来爬,如果用后台服务器不方便做黑产,可以考虑sqlmap,写一个通用的sqlmap工具,对视频页面也可以的,主要是抓数据。
动态网页抓取(ajax横行的年代,我们的网页是残缺的吗? )
网站优化 • 优采云 发表了文章 • 0 个评论 • 86 次浏览 • 2022-03-24 01:20
)
在ajax时代,很多网页的内容都是动态加载的,我们的小爬虫只抓取web服务器返回给我们的html,其中包括
跳过js加载部分,表示爬虫抓取的网页不完整,不完整。您可以在下面看到博客园的主页
从首页的加载中可以看出,页面渲染完成后,会有5个异步ajax请求。默认情况下,爬虫无法抓取这些ajax生成的内容。
这时候,如果你想得到它,你必须调用浏览器的内核引擎来下载这些动态页面。目前内核引擎是三足的。
Trident:也就是IE内核,WebBrowser就是基于这个内核,但是加载性能比较差。
Gecko:FF的内核比Trident的性能更好。
WebKit:Safari和Chrome的核心,性能你懂的,在真实场景中还是主要的。
好的,为了简单方便,这里我们使用WebBrowser来玩,使用WebBrowser的时候要注意以下几点:
首先:因为WebBrowser是System.Windows.Forms中的winform控件,所以我们需要设置STAThread标签。
第二:winform是事件驱动的,Console不响应事件,所有事件都在windows的消息队列中等待执行,以防止程序假死,
我们需要调用DoEvents方法来传递控制权,让操作系统执行其他事件。
第三:WebBrowser内容,我们需要使用DomDocument来查看,而不是DocumentText。
判断动态网页是否加载一般有两种方式:
①:设置一个最大值,因为每当异步加载一个js时,都会触发一个Navigating和DocumentCompleted事件,所以我们这里需要这样做
记录计数值
.
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Windows.Forms;
6 using System.Threading;
7 using System.IO;
8
9 namespace ConsoleApplication2
10 {
11 public class Program
12 {
13 static int hitCount = 0;
14
15 [STAThread]
16 static void Main(string[] args)
17 {
18 string url = "http://www.cnblogs.com";
19
20 WebBrowser browser = new WebBrowser();
21
22 browser.ScriptErrorsSuppressed = true;
23
24 browser.Navigating += (sender, e) =>
25 {
26 hitCount++;
27 };
28
29 browser.DocumentCompleted += (sender, e) =>
30 {
31 hitCount++;
32 };
33
34 browser.Navigate(url);
35
36 while (browser.ReadyState != WebBrowserReadyState.Complete)
37 {
38 Application.DoEvents();
39 }
40
41 while (hitCount < 16)
42 Application.DoEvents();
43
44 var htmldocument = (mshtml.HTMLDocument)browser.Document.DomDocument;
45
46 string gethtml = htmldocument.documentElement.outerHTML;
47
48 //写入文件
49 using (StreamWriter sw = new StreamWriter(Environment.CurrentDirectory + "//1.html"))
50 {
51 sw.WriteLine(gethtml);
52 }
53
54 Console.WriteLine("html 文件 已经生成!");
55
56 Console.Read();
57 }
58 }
59 }
然后,我们打开生成的1.html,看看js加载的内容有没有。
②:当然,除了通过判断最大值来判断加载是否完成,我们还可以通过设置一个Timer来判断,比如3s、4s、5s,稍后再查看
WEB浏览器是否加载。
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Windows.Forms;
6 using System.Threading;
7 using System.IO;
8
9 namespace ConsoleApplication2
10 {
11 public class Program
12 {
13 [STAThread]
14 static void Main(string[] args)
15 {
16 string url = "http://www.cnblogs.com";
17
18 WebBrowser browser = new WebBrowser();
19
20 browser.ScriptErrorsSuppressed = true;
21
22 browser.Navigate(url);
23
24 //先要等待加载完毕
25 while (browser.ReadyState != WebBrowserReadyState.Complete)
26 {
27 Application.DoEvents();
28 }
29
30 System.Timers.Timer timer = new System.Timers.Timer();
31
32 var isComplete = false;
33
34 timer.Elapsed += new System.Timers.ElapsedEventHandler((sender, e) =>
35 {
36 //加载完毕
37 isComplete = true;
38
39 timer.Stop();
40 });
41
42 timer.Interval = 1000 * 5;
43
44 timer.Start();
45
46 //继续等待 5s,等待js加载完
47 while (!isComplete)
48 Application.DoEvents();
49
50 var htmldocument = (mshtml.HTMLDocument)browser.Document.DomDocument;
51
52 string gethtml = htmldocument.documentElement.outerHTML;
53
54 //写入文件
55 using (StreamWriter sw = new StreamWriter(Environment.CurrentDirectory + "//1.html"))
56 {
57 sw.WriteLine(gethtml);
58 }
59
60 Console.WriteLine("html 文件 已经生成!");
61
62 Console.Read();
63 }
64 }
65 }
当然,效果还是一样的,就不截图了。从以上两种写法来看,我们的WebBrowser放在主线程中。让我们看看如何把它放在工作线程上。
很简单,只需将工作线程设置为STA模式即可。
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Windows.Forms;
6 using System.Threading;
7
8 namespace ConsoleApplication2
9 {
10 public class Program
11 {
12 static int hitCount = 0;
13
14 //[STAThread]
15 static void Main(string[] args)
16 {
17 Thread thread = new Thread(new ThreadStart(() =>
18 {
19 Init();
20 System.Windows.Forms.Application.Run();
21 }));
22
23 //将该工作线程设定为STA模式
24 thread.SetApartmentState(ApartmentState.STA);
25
26 thread.Start();
27
28 Console.Read();
29 }
30
31 static void Init()
32 {
33 string url = "http://www.cnblogs.com";
34
35 WebBrowser browser = new WebBrowser();
36
37 browser.ScriptErrorsSuppressed = true;
38
39 browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browser_DocumentCompleted);
40
41 browser.Navigating += new WebBrowserNavigatingEventHandler(browser_Navigating);
42
43 browser.Navigate(url);
44
45 while (browser.ReadyState != WebBrowserReadyState.Complete)
46 {
47 Application.DoEvents();
48 }
49
50 while (hitCount < 16)
51 Application.DoEvents();
52
53 var htmldocument = (mshtml.HTMLDocument)browser.Document.DomDocument;
54
55 string gethtml = htmldocument.documentElement.outerHTML;
56
57 Console.WriteLine(gethtml);
58 }
59
60 static void browser_Navigating(object sender, WebBrowserNavigatingEventArgs e)
61 {
62 hitCount++;
63 }
64
65 static void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
66 {
67 hitCount++;
68 }
69 }
70 }
查看全部
动态网页抓取(ajax横行的年代,我们的网页是残缺的吗?
)
在ajax时代,很多网页的内容都是动态加载的,我们的小爬虫只抓取web服务器返回给我们的html,其中包括
跳过js加载部分,表示爬虫抓取的网页不完整,不完整。您可以在下面看到博客园的主页

从首页的加载中可以看出,页面渲染完成后,会有5个异步ajax请求。默认情况下,爬虫无法抓取这些ajax生成的内容。
这时候,如果你想得到它,你必须调用浏览器的内核引擎来下载这些动态页面。目前内核引擎是三足的。
Trident:也就是IE内核,WebBrowser就是基于这个内核,但是加载性能比较差。
Gecko:FF的内核比Trident的性能更好。
WebKit:Safari和Chrome的核心,性能你懂的,在真实场景中还是主要的。
好的,为了简单方便,这里我们使用WebBrowser来玩,使用WebBrowser的时候要注意以下几点:
首先:因为WebBrowser是System.Windows.Forms中的winform控件,所以我们需要设置STAThread标签。
第二:winform是事件驱动的,Console不响应事件,所有事件都在windows的消息队列中等待执行,以防止程序假死,
我们需要调用DoEvents方法来传递控制权,让操作系统执行其他事件。
第三:WebBrowser内容,我们需要使用DomDocument来查看,而不是DocumentText。
判断动态网页是否加载一般有两种方式:
①:设置一个最大值,因为每当异步加载一个js时,都会触发一个Navigating和DocumentCompleted事件,所以我们这里需要这样做
记录计数值
.

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Windows.Forms;
6 using System.Threading;
7 using System.IO;
8
9 namespace ConsoleApplication2
10 {
11 public class Program
12 {
13 static int hitCount = 0;
14
15 [STAThread]
16 static void Main(string[] args)
17 {
18 string url = "http://www.cnblogs.com";
19
20 WebBrowser browser = new WebBrowser();
21
22 browser.ScriptErrorsSuppressed = true;
23
24 browser.Navigating += (sender, e) =>
25 {
26 hitCount++;
27 };
28
29 browser.DocumentCompleted += (sender, e) =>
30 {
31 hitCount++;
32 };
33
34 browser.Navigate(url);
35
36 while (browser.ReadyState != WebBrowserReadyState.Complete)
37 {
38 Application.DoEvents();
39 }
40
41 while (hitCount < 16)
42 Application.DoEvents();
43
44 var htmldocument = (mshtml.HTMLDocument)browser.Document.DomDocument;
45
46 string gethtml = htmldocument.documentElement.outerHTML;
47
48 //写入文件
49 using (StreamWriter sw = new StreamWriter(Environment.CurrentDirectory + "//1.html"))
50 {
51 sw.WriteLine(gethtml);
52 }
53
54 Console.WriteLine("html 文件 已经生成!");
55
56 Console.Read();
57 }
58 }
59 }

然后,我们打开生成的1.html,看看js加载的内容有没有。

②:当然,除了通过判断最大值来判断加载是否完成,我们还可以通过设置一个Timer来判断,比如3s、4s、5s,稍后再查看
WEB浏览器是否加载。

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Windows.Forms;
6 using System.Threading;
7 using System.IO;
8
9 namespace ConsoleApplication2
10 {
11 public class Program
12 {
13 [STAThread]
14 static void Main(string[] args)
15 {
16 string url = "http://www.cnblogs.com";
17
18 WebBrowser browser = new WebBrowser();
19
20 browser.ScriptErrorsSuppressed = true;
21
22 browser.Navigate(url);
23
24 //先要等待加载完毕
25 while (browser.ReadyState != WebBrowserReadyState.Complete)
26 {
27 Application.DoEvents();
28 }
29
30 System.Timers.Timer timer = new System.Timers.Timer();
31
32 var isComplete = false;
33
34 timer.Elapsed += new System.Timers.ElapsedEventHandler((sender, e) =>
35 {
36 //加载完毕
37 isComplete = true;
38
39 timer.Stop();
40 });
41
42 timer.Interval = 1000 * 5;
43
44 timer.Start();
45
46 //继续等待 5s,等待js加载完
47 while (!isComplete)
48 Application.DoEvents();
49
50 var htmldocument = (mshtml.HTMLDocument)browser.Document.DomDocument;
51
52 string gethtml = htmldocument.documentElement.outerHTML;
53
54 //写入文件
55 using (StreamWriter sw = new StreamWriter(Environment.CurrentDirectory + "//1.html"))
56 {
57 sw.WriteLine(gethtml);
58 }
59
60 Console.WriteLine("html 文件 已经生成!");
61
62 Console.Read();
63 }
64 }
65 }

当然,效果还是一样的,就不截图了。从以上两种写法来看,我们的WebBrowser放在主线程中。让我们看看如何把它放在工作线程上。
很简单,只需将工作线程设置为STA模式即可。

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Windows.Forms;
6 using System.Threading;
7
8 namespace ConsoleApplication2
9 {
10 public class Program
11 {
12 static int hitCount = 0;
13
14 //[STAThread]
15 static void Main(string[] args)
16 {
17 Thread thread = new Thread(new ThreadStart(() =>
18 {
19 Init();
20 System.Windows.Forms.Application.Run();
21 }));
22
23 //将该工作线程设定为STA模式
24 thread.SetApartmentState(ApartmentState.STA);
25
26 thread.Start();
27
28 Console.Read();
29 }
30
31 static void Init()
32 {
33 string url = "http://www.cnblogs.com";
34
35 WebBrowser browser = new WebBrowser();
36
37 browser.ScriptErrorsSuppressed = true;
38
39 browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browser_DocumentCompleted);
40
41 browser.Navigating += new WebBrowserNavigatingEventHandler(browser_Navigating);
42
43 browser.Navigate(url);
44
45 while (browser.ReadyState != WebBrowserReadyState.Complete)
46 {
47 Application.DoEvents();
48 }
49
50 while (hitCount < 16)
51 Application.DoEvents();
52
53 var htmldocument = (mshtml.HTMLDocument)browser.Document.DomDocument;
54
55 string gethtml = htmldocument.documentElement.outerHTML;
56
57 Console.WriteLine(gethtml);
58 }
59
60 static void browser_Navigating(object sender, WebBrowserNavigatingEventArgs e)
61 {
62 hitCount++;
63 }
64
65 static void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
66 {
67 hitCount++;
68 }
69 }
70 }

动态网页抓取(R语言结合自然语言处理研究报告的文本全部抓取出来(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2022-03-23 18:01
最近一直在研究R语言结合自然语言处理来分析公司研究报告相关的话题。不过由于单位的数据不能拿出来研究,只能周末在家看看怎么从网上抓取相关数据,效果还不错。各大券商的评级、推荐时间、股票代码、研究报告正文均可在线检索。具体图片如下,示例可在以下网址下载:
由于金融行业的研究报告总数不是很大,通过使用selenium控制浏览器行为来抓取相关数据,对于没有学过爬虫的人来说可以节省不少脑细胞,但是安装selenium有很多陷阱. 本文具体介绍如何安装selenium,使用R语言工具调用。
首先是安装JDK,从官网下载JDK。
单击“计算机-属性-高级系统设置”,单击“环境变量”。单击系统变量下的新建以创建新的系统环境变量。
(1)New->变量名“JAVA_HOME”,变量值“C:\Java\jdk1.8.0_05”(即JDK的安装路径)
(2)编辑->变量名“路径”,在原变量值末尾添加“;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin”
(3)New->变量名“CLASSPATH”,变量值“.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar”
安装完成后,cmd进入命令行,执行java -version可以看到正确的版本。
然后安装chrome,可以访问这个官网的网址,点击免费下载直接安装即可。
三是下载相关插件解压到chrome安装目录C:\Program Files(x86)\Google\Chrome\Application.
第四步
start-execute-cmd 进入命令行
cd C:\Program Files (x86)\Google\Chrome\Application (进入浏览器安装目录)
java -Dwebdriver.chrome.driver="chromedriver.exe" -jar selenium-server-standalone-3.9.1.jar (启动服务器) 查看全部
动态网页抓取(R语言结合自然语言处理研究报告的文本全部抓取出来(组图))
最近一直在研究R语言结合自然语言处理来分析公司研究报告相关的话题。不过由于单位的数据不能拿出来研究,只能周末在家看看怎么从网上抓取相关数据,效果还不错。各大券商的评级、推荐时间、股票代码、研究报告正文均可在线检索。具体图片如下,示例可在以下网址下载:

由于金融行业的研究报告总数不是很大,通过使用selenium控制浏览器行为来抓取相关数据,对于没有学过爬虫的人来说可以节省不少脑细胞,但是安装selenium有很多陷阱. 本文具体介绍如何安装selenium,使用R语言工具调用。
首先是安装JDK,从官网下载JDK。
单击“计算机-属性-高级系统设置”,单击“环境变量”。单击系统变量下的新建以创建新的系统环境变量。
(1)New->变量名“JAVA_HOME”,变量值“C:\Java\jdk1.8.0_05”(即JDK的安装路径)
(2)编辑->变量名“路径”,在原变量值末尾添加“;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin”
(3)New->变量名“CLASSPATH”,变量值“.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar”
安装完成后,cmd进入命令行,执行java -version可以看到正确的版本。
然后安装chrome,可以访问这个官网的网址,点击免费下载直接安装即可。
三是下载相关插件解压到chrome安装目录C:\Program Files(x86)\Google\Chrome\Application.
第四步
start-execute-cmd 进入命令行
cd C:\Program Files (x86)\Google\Chrome\Application (进入浏览器安装目录)
java -Dwebdriver.chrome.driver="chromedriver.exe" -jar selenium-server-standalone-3.9.1.jar (启动服务器)
动态网页抓取(生成htmlchrome浏览器下,怎么利用js或jquery获取本地ip地址)
网站优化 • 优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2022-03-22 21:21
Chrome扩展如何获取JS动态生成的网页元素?
应该不可能将事件绑定到控件不是动态生成的元素。
但是您可以将事件绑定到顶级文档以确定单击了哪个元素。
生成html
chrome浏览器下如何使用js或者jquery获取本地ip地址,不要依赖第三方应用
具体解决方案如下:
1、原因是chrome不支持js在本地操作cookies!
经测试,除chrome浏览器外,其他主流浏览器(即firefox等)均支持js在本地操作cookies。当然,所有部署到服务器的浏览器都支持。
2、当然,还有一个原因:浏览器设置为不支持cookies。这样,调试js来操作cookies当然是无效的。
你以为你乱写,我就给你加分吗?. .
为什么在 Chrome 插件中引用 jQuery 无效
你可以用f12打开控制台看看有没有报错,看看你有没有导入jQuery.js文件,用你自己的版本号查看你的浏览器版本支持的JQuery版本号。首先,请检查浏览器是否禁用了javascript脚本。
第二页打开后,f12查看是否有错误。即使是一点点错误也会终止所有相关代码
第三个也是打开页面后f12。在elements标签的代码中,找到你引用jquery的地方。您的 jquery 文件将显示一个超链接。点击查看能否以查看代码的形式打开。如果不是 可以说明引用的文件或者引用的路径有误
最后请检查代码中jquery文件的加载是否在所有调用jquery的函数之前
如何使用jquery判断谷歌浏览器
判断$.browser.WebKit等于True就够了
苹果的 Safari 和谷歌的 Chrome 浏览器都是基于 WebKit 框架 jquery1.8 开发的
如果($.browser.chrome)
{
alert("chrome 浏览器!");
一句话 var ischrome = navigator.useragent.tolowercase().match(/chrome/) != null; if (ischrome) { alert('chrome'); } 查看全部
动态网页抓取(生成htmlchrome浏览器下,怎么利用js或jquery获取本地ip地址)
Chrome扩展如何获取JS动态生成的网页元素?
应该不可能将事件绑定到控件不是动态生成的元素。
但是您可以将事件绑定到顶级文档以确定单击了哪个元素。
生成html
chrome浏览器下如何使用js或者jquery获取本地ip地址,不要依赖第三方应用
具体解决方案如下:
1、原因是chrome不支持js在本地操作cookies!
经测试,除chrome浏览器外,其他主流浏览器(即firefox等)均支持js在本地操作cookies。当然,所有部署到服务器的浏览器都支持。
2、当然,还有一个原因:浏览器设置为不支持cookies。这样,调试js来操作cookies当然是无效的。
你以为你乱写,我就给你加分吗?. .
为什么在 Chrome 插件中引用 jQuery 无效
你可以用f12打开控制台看看有没有报错,看看你有没有导入jQuery.js文件,用你自己的版本号查看你的浏览器版本支持的JQuery版本号。首先,请检查浏览器是否禁用了javascript脚本。
第二页打开后,f12查看是否有错误。即使是一点点错误也会终止所有相关代码
第三个也是打开页面后f12。在elements标签的代码中,找到你引用jquery的地方。您的 jquery 文件将显示一个超链接。点击查看能否以查看代码的形式打开。如果不是 可以说明引用的文件或者引用的路径有误
最后请检查代码中jquery文件的加载是否在所有调用jquery的函数之前
如何使用jquery判断谷歌浏览器
判断$.browser.WebKit等于True就够了
苹果的 Safari 和谷歌的 Chrome 浏览器都是基于 WebKit 框架 jquery1.8 开发的
如果($.browser.chrome)
{
alert("chrome 浏览器!");
一句话 var ischrome = navigator.useragent.tolowercase().match(/chrome/) != null; if (ischrome) { alert('chrome'); }
动态网页抓取(不用动态渲染的页面来说管网页后台的Ajax接口有哪些参数 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 76 次浏览 • 2022-04-04 20:11
)
之前我们了解了Ajax的分析爬取方式,其实就是JavaScript动态渲染页面的一种情况。通过直接分析Ajax,我们仍然可以使用requests或者urllib来实现数据爬取。
但是,JavaScript 渲染的页面不仅仅是 Ajax。为了解决这些问题,我们可以直接使用模拟浏览器操作的方式。这样就可以在浏览器中看到它长什么样了,抓取到什么源码,也就是可见就可以爬取了。这样,我们就不再需要关心网页内部的 JavaScript 使用什么算法来渲染页面,也不需要关心网页后台的 Ajax 接口的参数。
硒的使用
Selenium 是一个自动化测试工具,可以用来驱动浏览器执行特定的动作,比如点击、下拉等,同时还可以获取当前渲染的页面的源代码浏览器,以便它在可见时可以被抓取。对于一些 JavaScript 动态渲染的页面,这种爬取方式非常有效。
准备好工作了
这里我们以 Chrome 为例来说明 Selenium 的使用。在开始之前,请确保您已正确安装 Chrome 浏览器并使用 ChromeDriver 进行配置(以匹配您的浏览器版本)。此外,需要正确安装 Python 的 Selenium 库。
基本用途
首先,让我们大致了解一下 Selenium 的一些功能。一个例子如下:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
try:
driver.get('https://www.baidu.com 查看全部
动态网页抓取(不用动态渲染的页面来说管网页后台的Ajax接口有哪些参数
)
之前我们了解了Ajax的分析爬取方式,其实就是JavaScript动态渲染页面的一种情况。通过直接分析Ajax,我们仍然可以使用requests或者urllib来实现数据爬取。
但是,JavaScript 渲染的页面不仅仅是 Ajax。为了解决这些问题,我们可以直接使用模拟浏览器操作的方式。这样就可以在浏览器中看到它长什么样了,抓取到什么源码,也就是可见就可以爬取了。这样,我们就不再需要关心网页内部的 JavaScript 使用什么算法来渲染页面,也不需要关心网页后台的 Ajax 接口的参数。
硒的使用
Selenium 是一个自动化测试工具,可以用来驱动浏览器执行特定的动作,比如点击、下拉等,同时还可以获取当前渲染的页面的源代码浏览器,以便它在可见时可以被抓取。对于一些 JavaScript 动态渲染的页面,这种爬取方式非常有效。
准备好工作了
这里我们以 Chrome 为例来说明 Selenium 的使用。在开始之前,请确保您已正确安装 Chrome 浏览器并使用 ChromeDriver 进行配置(以匹配您的浏览器版本)。此外,需要正确安装 Python 的 Selenium 库。
基本用途
首先,让我们大致了解一下 Selenium 的一些功能。一个例子如下:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
try:
driver.get('https://www.baidu.com
动态网页抓取(一个爬虫项目目录结构(一)--一个 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 218 次浏览 • 2022-04-04 20:08
)
我们首先创建一个爬虫项目,这里我们使用scrapy框架来创建它。
scrapy startproject poco
然后cd到poco文件夹初始化项目
scrapy genspider pocoSpider poco.com
打开项目,项目目录结构如下
我们的爬虫代码写在 pocoSpider 文件中,现在我们打开 网站 来分析网页。
我们选择人像分类爬行
可以看到页面上有很多用户id。我们需要先获取每个id的url,然后去详情页抓图。
右键查看网页源码,发现该页面是js动态生成的网页
并且页面是懒加载的,右键检查元素,查看网络
如果找到请求的图片,请获取请求参数,url地址,复制到postman中调用,成功获取返回数据
分析请求参数,猜测是否可以通过,修改参数得到响应结果,但是修改请求参数后,请求失败,看来直接修改参数的方法无法得到我们需要的url地址。
让我们随意点击查看网页源代码,看看细节是否也是js动态加载的。
好在我们需要的数据可以直接在源码中查看,每张图片的地址都在标签里面,很简单。我们可以先爬取这个页面的图片
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
class PocospiderSpider(scrapy.Spider):
name = 'pocoSpider'
allowed_domains = ['poco.com']
start_urls = ['https://www.poco.cn/works/deta ... 39%3B]
def parse(self, response):
img_list = response.xpath("//img/@data-src").extract()
for img in img_list:
print(img)
if __name__ == "__main__":
process = CrawlerProcess(get_project_settings())
process.crawl('pocoSpider')
process.start()
不出所料,我们成功拿到了当前id下的所有图片:
现在我们只需要获取所有id对应的url地址并回收请求就可以获取所有图片的地址
由于无法通过修改参数获取数据,所以我们使用selenium框架来模拟浏览器操作。
分析页面,每次拉到最后都发送一个请求。我们关闭页面的图片加载以加快访问速度。我们将爬取的数据存储在数据库中,这里我们使用mongod。定义下拉刷新函数,每次刷新后execute_times sleep 0.5秒,以便浏览器渲染页面。这里我们刷新 40 次来获取数据。
我们在setting.py文件中设置数据库的地址、端口、数据库名
LOCAL_MONGO_HOST = '127.0.0.1'
LOCAL_MONGO_PORT = 27017
DB_NAME = 'POCO'
编写 selenium 模拟操作的代码
执行完之后大概能拿到800多条数据,现在我们重写爬虫代码。
import pymongo
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from poco.settings import LOCAL_MONGO_HOST,LOCAL_MONGO_PORT,DB_NAME
class PocospiderSpider(scrapy.Spider):
name = 'pocoSpider'
mongo_client = pymongo.MongoClient(LOCAL_MONGO_HOST, LOCAL_MONGO_PORT)
collection = mongo_client[DB_NAME]["idlist"]
id_list = collection.find()
def start_requests(self):
for id in self.id_list:
item = {}
item["folder"]=id["_id"]
item["img_urls"]=[]
yield scrapy.Request(url=id["url"],callback=self.parse_detail,meta={"item":item})
def parse_detail(self, response):
item = response.meta["item"]
img_list = response.xpath("//img/@data-src").extract()
for img in img_list:
if img == "":
continue
img = "https:"+img
item["img_urls"].append(img)
yield item
if __name__ == "__main__":
process = CrawlerProcess(get_project_settings())
process.crawl('pocoSpider')
process.start()
我们scrapy管道下载图片,我们先写一个管道方法通过id存储图片,我们重写file_path方法修改图片的存储路径
from scrapy.exceptions import DropItem
from scrapy.pipelines.images import ImagesPipeline
from scrapy import Request
class MyImagesPipeline(ImagesPipeline):
def get_media_requests(self, item, info):
for image_url in item['img_urls']:
referer = image_url
yield Request(image_url,meta={'item':item,'referer':referer})
def file_path(self, request, response=None, info=None):
item = request.meta['item']
folder = item['folder'].strip()
img_name = request.url.split("/")[-1]
filename = u'img/{0}/{1}'.format(folder,img_name)
return filename
def item_completed(self, results, item, info):
image_path = [x['path'] for ok,x in results if ok]
if not image_path:
raise DropItem('Item contains no images')
# item['image_paths'] = image_path
return item
最后我们修改设置文件中的图片下载中间件和PipeLines
DOWNLOADER_MIDDLEWARES = {
'poco.middlewares.PocoDownloaderMiddleware': 543,
}
IMAGES_STORE=r'E:\\'
IMAGES_EXPIRES = 30
# Enable or disable extensions
# See https://doc.scrapy.org/en/late ... .html
#EXTENSIONS = {
# 'scrapy.extensions.telnet.TelnetConsole': None,
#}
ITEM_PIPELINES = {
'poco.pipelines.MyImagesPipeline': 300,
}
CONCURRENT_REQUESTS = 32
DOWNLOAD_DELAY = 0.1
# Configure item pipeli
至此,poco网站的爬虫已经写好,代码运行完毕,图片爬取成功,按照id分类存储
后记:其实爬虫代码还是有bug的。当爬虫运行 10 分钟,没有爬取到 id 时,会自动停止。仔细查看代码,发现一个mongodb的坑。那是
collection = mongo_client[DB_NAME]["idlist"]
id_list = collection.find()
当调用 db.采集.find() 时,它返回的不是所有数据,而是一个“光标”。它的默认行为是:首先在数据库中查询 101 个文档,或者 1 MB 的文档,这取决于首先满足哪个条件;然后每次游标用完时,查询 4 MB 的文档。此外,find() 的默认行为是返回一个在 10 分钟不活动后超时的游标。如果 10 分钟内没有处理请求,那么我们将无法获取剩余的 url,因此爬虫将停止。
解决方法也很简单,就是直接将id_list中的数据存入开头的list中。
# -*- coding: utf-8 -*-
import pymongo
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from poco.settings import LOCAL_MONGO_HOST,LOCAL_MONGO_PORT,DB_NAME
class PocospiderSpider(scrapy.Spider):
name = 'pocoSpider'
mongo_client = pymongo.MongoClient(LOCAL_MONGO_HOST, LOCAL_MONGO_PORT)
collection = mongo_client[DB_NAME]["idlist"]
id_list = collection.find()
ids=[]
for id in id_list:
ids.append(id)
def start_requests(self):
for id in self.ids:
item = {}
item["folder"]=id["_id"]
item["img_urls"]=[]
yield scrapy.Request(url=id["url"],callback=self.parse_detail,meta={"item":item})
def parse_detail(self, response):
item = response.meta["item"]
img_list = response.xpath("//img/@data-src").extract()
for img in img_list:
if img == "":
continue
img = "https:"+img
item["img_urls"].append(img)
yield item
if __name__ == "__main__":
process = CrawlerProcess(get_project_settings())
process.crawl('pocoSpider')
process.start() 查看全部
动态网页抓取(一个爬虫项目目录结构(一)--一个
)
我们首先创建一个爬虫项目,这里我们使用scrapy框架来创建它。
scrapy startproject poco
然后cd到poco文件夹初始化项目
scrapy genspider pocoSpider poco.com
打开项目,项目目录结构如下

我们的爬虫代码写在 pocoSpider 文件中,现在我们打开 网站 来分析网页。
我们选择人像分类爬行
可以看到页面上有很多用户id。我们需要先获取每个id的url,然后去详情页抓图。
右键查看网页源码,发现该页面是js动态生成的网页

并且页面是懒加载的,右键检查元素,查看网络

如果找到请求的图片,请获取请求参数,url地址,复制到postman中调用,成功获取返回数据

分析请求参数,猜测是否可以通过,修改参数得到响应结果,但是修改请求参数后,请求失败,看来直接修改参数的方法无法得到我们需要的url地址。
让我们随意点击查看网页源代码,看看细节是否也是js动态加载的。

好在我们需要的数据可以直接在源码中查看,每张图片的地址都在标签里面,很简单。我们可以先爬取这个页面的图片
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
class PocospiderSpider(scrapy.Spider):
name = 'pocoSpider'
allowed_domains = ['poco.com']
start_urls = ['https://www.poco.cn/works/deta ... 39%3B]
def parse(self, response):
img_list = response.xpath("//img/@data-src").extract()
for img in img_list:
print(img)
if __name__ == "__main__":
process = CrawlerProcess(get_project_settings())
process.crawl('pocoSpider')
process.start()
不出所料,我们成功拿到了当前id下的所有图片:

现在我们只需要获取所有id对应的url地址并回收请求就可以获取所有图片的地址
由于无法通过修改参数获取数据,所以我们使用selenium框架来模拟浏览器操作。
分析页面,每次拉到最后都发送一个请求。我们关闭页面的图片加载以加快访问速度。我们将爬取的数据存储在数据库中,这里我们使用mongod。定义下拉刷新函数,每次刷新后execute_times sleep 0.5秒,以便浏览器渲染页面。这里我们刷新 40 次来获取数据。
我们在setting.py文件中设置数据库的地址、端口、数据库名
LOCAL_MONGO_HOST = '127.0.0.1'
LOCAL_MONGO_PORT = 27017
DB_NAME = 'POCO'
编写 selenium 模拟操作的代码
执行完之后大概能拿到800多条数据,现在我们重写爬虫代码。
import pymongo
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from poco.settings import LOCAL_MONGO_HOST,LOCAL_MONGO_PORT,DB_NAME
class PocospiderSpider(scrapy.Spider):
name = 'pocoSpider'
mongo_client = pymongo.MongoClient(LOCAL_MONGO_HOST, LOCAL_MONGO_PORT)
collection = mongo_client[DB_NAME]["idlist"]
id_list = collection.find()
def start_requests(self):
for id in self.id_list:
item = {}
item["folder"]=id["_id"]
item["img_urls"]=[]
yield scrapy.Request(url=id["url"],callback=self.parse_detail,meta={"item":item})
def parse_detail(self, response):
item = response.meta["item"]
img_list = response.xpath("//img/@data-src").extract()
for img in img_list:
if img == "":
continue
img = "https:"+img
item["img_urls"].append(img)
yield item
if __name__ == "__main__":
process = CrawlerProcess(get_project_settings())
process.crawl('pocoSpider')
process.start()
我们scrapy管道下载图片,我们先写一个管道方法通过id存储图片,我们重写file_path方法修改图片的存储路径
from scrapy.exceptions import DropItem
from scrapy.pipelines.images import ImagesPipeline
from scrapy import Request
class MyImagesPipeline(ImagesPipeline):
def get_media_requests(self, item, info):
for image_url in item['img_urls']:
referer = image_url
yield Request(image_url,meta={'item':item,'referer':referer})
def file_path(self, request, response=None, info=None):
item = request.meta['item']
folder = item['folder'].strip()
img_name = request.url.split("/")[-1]
filename = u'img/{0}/{1}'.format(folder,img_name)
return filename
def item_completed(self, results, item, info):
image_path = [x['path'] for ok,x in results if ok]
if not image_path:
raise DropItem('Item contains no images')
# item['image_paths'] = image_path
return item
最后我们修改设置文件中的图片下载中间件和PipeLines
DOWNLOADER_MIDDLEWARES = {
'poco.middlewares.PocoDownloaderMiddleware': 543,
}
IMAGES_STORE=r'E:\\'
IMAGES_EXPIRES = 30
# Enable or disable extensions
# See https://doc.scrapy.org/en/late ... .html
#EXTENSIONS = {
# 'scrapy.extensions.telnet.TelnetConsole': None,
#}
ITEM_PIPELINES = {
'poco.pipelines.MyImagesPipeline': 300,
}
CONCURRENT_REQUESTS = 32
DOWNLOAD_DELAY = 0.1
# Configure item pipeli
至此,poco网站的爬虫已经写好,代码运行完毕,图片爬取成功,按照id分类存储

后记:其实爬虫代码还是有bug的。当爬虫运行 10 分钟,没有爬取到 id 时,会自动停止。仔细查看代码,发现一个mongodb的坑。那是
collection = mongo_client[DB_NAME]["idlist"]
id_list = collection.find()
当调用 db.采集.find() 时,它返回的不是所有数据,而是一个“光标”。它的默认行为是:首先在数据库中查询 101 个文档,或者 1 MB 的文档,这取决于首先满足哪个条件;然后每次游标用完时,查询 4 MB 的文档。此外,find() 的默认行为是返回一个在 10 分钟不活动后超时的游标。如果 10 分钟内没有处理请求,那么我们将无法获取剩余的 url,因此爬虫将停止。
解决方法也很简单,就是直接将id_list中的数据存入开头的list中。
# -*- coding: utf-8 -*-
import pymongo
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from poco.settings import LOCAL_MONGO_HOST,LOCAL_MONGO_PORT,DB_NAME
class PocospiderSpider(scrapy.Spider):
name = 'pocoSpider'
mongo_client = pymongo.MongoClient(LOCAL_MONGO_HOST, LOCAL_MONGO_PORT)
collection = mongo_client[DB_NAME]["idlist"]
id_list = collection.find()
ids=[]
for id in id_list:
ids.append(id)
def start_requests(self):
for id in self.ids:
item = {}
item["folder"]=id["_id"]
item["img_urls"]=[]
yield scrapy.Request(url=id["url"],callback=self.parse_detail,meta={"item":item})
def parse_detail(self, response):
item = response.meta["item"]
img_list = response.xpath("//img/@data-src").extract()
for img in img_list:
if img == "":
continue
img = "https:"+img
item["img_urls"].append(img)
yield item
if __name__ == "__main__":
process = CrawlerProcess(get_project_settings())
process.crawl('pocoSpider')
process.start()
动态网页抓取(动态网页是什么动态网页文件的扩展名有哪些,以及静态网页的区别)
网站优化 • 优采云 发表了文章 • 0 个评论 • 104 次浏览 • 2022-04-04 16:02
网站可以选择不同的页面类型进行构建,分为动态页面和静态页面。之前作者已经给大家介绍过静态页面。本文将重点介绍动态页面,看看什么是动态页面,动态页面网页文件的扩展名是什么,动态网页和静态网页有什么区别。
一、什么是动态网页
所谓动态网页,是指相对于静态网页的一种网页编程技术。对于静态网页,随着html代码的生成,页面的内容和显示效果基本不会改变——除非你修改了页面代码。动态网页并非如此。虽然页面代码没有改变,但是显示的内容会随着时间、环境或数据库操作的结果而改变。
动态网页的特点:
1.交互性:网页根据用户请求动态变化和显示内容
2.自动更新:新的页面内容将自动生成,无需更改页面代码。
3.随机性:在不同的时间,不同的人同时访问同一个URL会有不同的页面效果,比如普通用户和系统管理员。
二、动态网页文件的扩展
网站正在建设的动态网页后缀为.asp、.jsp、.php、.perl、.cgi等形式,并且有一个标志性的符号——“?” 在动态网站 URL 中。这里所说的动态网页与网页上的各种动画、滚动字幕等视觉“动态效果”没有直接关系。动态网页也可以是纯文本内容或收录各种动画。这些只是网页具体内容的呈现形式,无论网页是否具有动态效果,采用动态网站技术生成的网页都称为动态网页。
三、动态网页和静态网页的区别1、动态网页和静态网页在更新维护上的区别:
一旦静态网页内容发布到 网站 服务器上,无论是否有用户访问,这些网页内容都会保存在 网站 服务器上。如果你想修改一个网页的内容,你必须修改它的源代码并重新上传到服务器。静态网页没有数据库支持。当网站信息量很大时,网页的创建和维护都比较困难
动态网页可以根据不同的用户请求、时间或环境要求动态生成不同的网页内容,而动态网页一般都是基于数据库技术的,可以大大减少网站维护的工作量
2、动态网页和静态网页在交互性方面的区别:
静态网页的交互性较差,因为许多内容是固定的并且在功能上有很大的限制。
动态网页可以实现更多的功能,如用户登录、注册、查询等。
3、动态网页和静态网页在响应速度上的区别:
静态网页的内容比较固定,容易被搜索引擎检索到,不需要连接数据库,所以响应速度比较快
动态网页实际上并不是独立存在于服务器上的网页文件。服务器只有在用户请求时才返回一个完整的网页,这涉及到数据连接访问和查询等一系列过程,所以响应速度比较慢。
4、动态网页和静态网页在访问特性方面的区别:
静态网页的每个网页都有一个固定的网址,网页网址后缀为.htm、.html、.shtml等常用格式,不收录“?”,可直接双开点击
这 ”?” 在动态网页中对搜索引擎有一定的问题。一般情况下,搜索引擎不可能从网站的数据库中访问所有网页,或者出于技术考虑,在搜索过程中不爬取。“?”后面的内容 URL中的不能直接双击打开
关于动态页面的问题,本文重点介绍什么是动态网页,动态网页的文件扩展名有哪些,动态网页和静态网页有什么区别。通过本文的内容,你应该可以对动态页面有一个足够的了解。在网站优化方面,搜索引擎已经能够很好的识别动态页面,所以合适的动态页面不会影响seo。不过目前更多的网站还是选择静态页面,或者说是伪静态页面。 查看全部
动态网页抓取(动态网页是什么动态网页文件的扩展名有哪些,以及静态网页的区别)
网站可以选择不同的页面类型进行构建,分为动态页面和静态页面。之前作者已经给大家介绍过静态页面。本文将重点介绍动态页面,看看什么是动态页面,动态页面网页文件的扩展名是什么,动态网页和静态网页有什么区别。
一、什么是动态网页
所谓动态网页,是指相对于静态网页的一种网页编程技术。对于静态网页,随着html代码的生成,页面的内容和显示效果基本不会改变——除非你修改了页面代码。动态网页并非如此。虽然页面代码没有改变,但是显示的内容会随着时间、环境或数据库操作的结果而改变。
动态网页的特点:
1.交互性:网页根据用户请求动态变化和显示内容
2.自动更新:新的页面内容将自动生成,无需更改页面代码。
3.随机性:在不同的时间,不同的人同时访问同一个URL会有不同的页面效果,比如普通用户和系统管理员。
二、动态网页文件的扩展
网站正在建设的动态网页后缀为.asp、.jsp、.php、.perl、.cgi等形式,并且有一个标志性的符号——“?” 在动态网站 URL 中。这里所说的动态网页与网页上的各种动画、滚动字幕等视觉“动态效果”没有直接关系。动态网页也可以是纯文本内容或收录各种动画。这些只是网页具体内容的呈现形式,无论网页是否具有动态效果,采用动态网站技术生成的网页都称为动态网页。
三、动态网页和静态网页的区别1、动态网页和静态网页在更新维护上的区别:
一旦静态网页内容发布到 网站 服务器上,无论是否有用户访问,这些网页内容都会保存在 网站 服务器上。如果你想修改一个网页的内容,你必须修改它的源代码并重新上传到服务器。静态网页没有数据库支持。当网站信息量很大时,网页的创建和维护都比较困难
动态网页可以根据不同的用户请求、时间或环境要求动态生成不同的网页内容,而动态网页一般都是基于数据库技术的,可以大大减少网站维护的工作量
2、动态网页和静态网页在交互性方面的区别:
静态网页的交互性较差,因为许多内容是固定的并且在功能上有很大的限制。
动态网页可以实现更多的功能,如用户登录、注册、查询等。
3、动态网页和静态网页在响应速度上的区别:
静态网页的内容比较固定,容易被搜索引擎检索到,不需要连接数据库,所以响应速度比较快
动态网页实际上并不是独立存在于服务器上的网页文件。服务器只有在用户请求时才返回一个完整的网页,这涉及到数据连接访问和查询等一系列过程,所以响应速度比较慢。
4、动态网页和静态网页在访问特性方面的区别:
静态网页的每个网页都有一个固定的网址,网页网址后缀为.htm、.html、.shtml等常用格式,不收录“?”,可直接双开点击
这 ”?” 在动态网页中对搜索引擎有一定的问题。一般情况下,搜索引擎不可能从网站的数据库中访问所有网页,或者出于技术考虑,在搜索过程中不爬取。“?”后面的内容 URL中的不能直接双击打开
关于动态页面的问题,本文重点介绍什么是动态网页,动态网页的文件扩展名有哪些,动态网页和静态网页有什么区别。通过本文的内容,你应该可以对动态页面有一个足够的了解。在网站优化方面,搜索引擎已经能够很好的识别动态页面,所以合适的动态页面不会影响seo。不过目前更多的网站还是选择静态页面,或者说是伪静态页面。
动态网页抓取(,论丈摘要基于Lucene的网页与系统实现的相关理论与使用方法)
网站优化 • 优采云 发表了文章 • 0 个评论 • 315 次浏览 • 2022-04-04 16:02
本学位论文作者及导师充分了解东北大学关于学位论文保存和使用的规定:即学校有权将学位论文的副本和磁盘留存并送交国家有关部门或机构,允许学位论文发表。可供参考和借阅。本人同意东北大学可以将论文的全部或部分内容编入相关数据库进行检索和交流。
(如作者与导师不同意在线交流,请在下方签字,否则视为同意。)
论文作者签名: 导师签名:
签名日期:签名日期
H
"
吨
,,
•
.
,.
"r
东北大学硕士学位论文摘要
基于Lucene的网络爬取与检索系统
,
概括
随着互联网的发展和Web资源的丰富,利用Web全文信息检索系统获取所需信息已成为人们日常生活的重要组成部分。
-^,·,准确高效地查找信息。
介绍了Web信息检索和系统实现的相关理论和技术。
在Web全文信息检索中的应用得到了深入的实践。第二章介绍了论文的相关理论,如搜索引擎的类型、中文分词方法、倒排索引理论以及论文中使用的Lucene的原理和使用。针对网页的特点,提出了两种网页模板分析算法。第一种算法基于最长公共子序列模型,采用动态规划的方法寻找最优解。对原创文档的算法进行优化和扩展,达到查找网页模板字符串和插入字符串的目的,二次算法利用相关的统计理论和原理,将网页模板抽象成数学模型,并在网页的开始位置和结束位置提取网页的共同logo,根据文本的长度计算不同的方差,确定文本在原文中的位置,从而得到文本的内容可以从网页中提取,从而节省空间,减少索引和搜索的时间。比较了两种算法的优缺点。第四章介绍了一个用Java开发的网络蜘蛛,包括异构数据的处理,如word、pdf、rtf等文本 以便从网页中提取文本的内容,从而节省空间,减少索引和搜索的时间。比较了两种算法的优缺点。第四章介绍了一个用Java开发的网络蜘蛛,包括异构数据的处理,如word、pdf、rtf等文本 以便从网页中提取文本的内容,从而节省空间,减少索引和搜索的时间。比较了两种算法的优缺点。第四章介绍了一个用Java开发的网络蜘蛛,包括异构数据的处理,如word、pdf、rtf等文本
此外,还介绍了一种解析HTML文件的方法以及多线程的使用。第五章实现了网络爬虫系统,自动从互联网上下载用户指定的网页信息,包括内容和下一页。提高了搜索速度,提高了信息的准确性和及时性,节省了大量的存储空间。
之间。
从理论和实践的角度来看,本文既包括算法的设计和分析,也包括具体程序的实现,使用了Oracle、Tomcat、Jsp、Java、Eclipse、Lucene等软件和语言。
HTML解析方法为用户节省了时间,提高了工作效率。
关键词:公共子序列;网络蜘蛛:Lucene;倒排索引;全文检索
-
'
一种
唱,
绿色
Ĵ
ü
Ĵ
'
'
东北大学硕士论文摘要
基于Lucene的网站爬虫与检索系统
抽象的
●
随着开发工作和Web资源的扩展,如何
我是
'系统已成为日常生活的重要组成部分,用户越来越多
关心如何更准确、更有效地查找信息。
本文介绍了Web信息检索系统及其相关理论和技术,并进行了深入的实践,展示了如何从Web信息中获取信息。 查看全部
动态网页抓取(,论丈摘要基于Lucene的网页与系统实现的相关理论与使用方法)
本学位论文作者及导师充分了解东北大学关于学位论文保存和使用的规定:即学校有权将学位论文的副本和磁盘留存并送交国家有关部门或机构,允许学位论文发表。可供参考和借阅。本人同意东北大学可以将论文的全部或部分内容编入相关数据库进行检索和交流。
(如作者与导师不同意在线交流,请在下方签字,否则视为同意。)
论文作者签名: 导师签名:
签名日期:签名日期
H
"
吨
,,
•
.
,.
"r
东北大学硕士学位论文摘要
基于Lucene的网络爬取与检索系统
,
概括
随着互联网的发展和Web资源的丰富,利用Web全文信息检索系统获取所需信息已成为人们日常生活的重要组成部分。
-^,·,准确高效地查找信息。
介绍了Web信息检索和系统实现的相关理论和技术。
在Web全文信息检索中的应用得到了深入的实践。第二章介绍了论文的相关理论,如搜索引擎的类型、中文分词方法、倒排索引理论以及论文中使用的Lucene的原理和使用。针对网页的特点,提出了两种网页模板分析算法。第一种算法基于最长公共子序列模型,采用动态规划的方法寻找最优解。对原创文档的算法进行优化和扩展,达到查找网页模板字符串和插入字符串的目的,二次算法利用相关的统计理论和原理,将网页模板抽象成数学模型,并在网页的开始位置和结束位置提取网页的共同logo,根据文本的长度计算不同的方差,确定文本在原文中的位置,从而得到文本的内容可以从网页中提取,从而节省空间,减少索引和搜索的时间。比较了两种算法的优缺点。第四章介绍了一个用Java开发的网络蜘蛛,包括异构数据的处理,如word、pdf、rtf等文本 以便从网页中提取文本的内容,从而节省空间,减少索引和搜索的时间。比较了两种算法的优缺点。第四章介绍了一个用Java开发的网络蜘蛛,包括异构数据的处理,如word、pdf、rtf等文本 以便从网页中提取文本的内容,从而节省空间,减少索引和搜索的时间。比较了两种算法的优缺点。第四章介绍了一个用Java开发的网络蜘蛛,包括异构数据的处理,如word、pdf、rtf等文本
此外,还介绍了一种解析HTML文件的方法以及多线程的使用。第五章实现了网络爬虫系统,自动从互联网上下载用户指定的网页信息,包括内容和下一页。提高了搜索速度,提高了信息的准确性和及时性,节省了大量的存储空间。
之间。
从理论和实践的角度来看,本文既包括算法的设计和分析,也包括具体程序的实现,使用了Oracle、Tomcat、Jsp、Java、Eclipse、Lucene等软件和语言。
HTML解析方法为用户节省了时间,提高了工作效率。
关键词:公共子序列;网络蜘蛛:Lucene;倒排索引;全文检索
-
'
一种
唱,
绿色
Ĵ
ü
Ĵ
'
'
东北大学硕士论文摘要
基于Lucene的网站爬虫与检索系统
抽象的
●
随着开发工作和Web资源的扩展,如何
我是
'系统已成为日常生活的重要组成部分,用户越来越多
关心如何更准确、更有效地查找信息。
本文介绍了Web信息检索系统及其相关理论和技术,并进行了深入的实践,展示了如何从Web信息中获取信息。
动态网页抓取(爬取百度百科的历史记录,结果在时隔四个月之后再次遇到的对手)
网站优化 • 优采云 发表了文章 • 0 个评论 • 378 次浏览 • 2022-04-04 02:02
动态页面爬取
很久没有写爬虫了。今天敲了一个爬虫——爬百度百科的历史记录。结果时隔四个月再次遇到的对手居然是动态页面(我一开始觉得百度太简单了。),但经过一番努力,还是达到了自己的目标,然后就写了博客作为评论。
一、概念
动态页面实际上是相对于静态页面的。面对静态页面时,直接查看响应一般是网页的整个代码,而动态页面则不然。一般来说,当再次打开动态页面的响应时,会与您在网页上看到的有所不同。
二、练习和练习前
因为我很喜欢练习,所以我会一言不发地练习,练习会给你真正的知识,你多练习就会明白。
目标网页:万科百度百科历史版本实现环境:win32版本:python3.6.2 实际目标:获取万科百度百科历史版本历史修改时间并制作图表或csv文件
三、流程说明
和所有爬虫一样,我们的第一步会是分析网页,因为我们的目标选择的是动态网页,所以我们还需要跟踪json文件等等。过程:
1、网页分析2、查询跟踪json等文件或xhr 3、文本匹配4、绘制或制作csv
四、工具准备
我们需要的库是(所有最新版本):
1.requests 2.re(以下库对于爬虫来说不是必需的,但它们是我这次需要的)3.matplotlib(用于可视化)4.datetime(用于时间操作)5.Pandas(python强大的数据处理库)6.os(系统操作)(我更喜欢原来的re库,当然这里用正则表达式可以解决所有问题)
你需要知道的:
1.python语法基础2.正则表达式匹配规则(以下不是爬虫必备)3.datetime一些基本功能4.matplotlib可视化操作(虽然这不是爬虫必须的,但很多情况下,数据可视化会让数据更直观,更容易做出判断)5.pandas库的基本使用(非爬虫必备,但数据分析必须学会)
五、网页分析
首先我们打开我们的目标页面→万科百度百科历史版。
好像一切正常,然后我们查看url,也有前面提到的规则,但是真的一切正常吗?
如果你把这个页面做为静态页面,那肯定是完蛋了,因为我一开始就是这样做的,当你在第一页查找代码时,你会发现一切正常,但是当你在第二页查找代码时page 有时,您会发现一个事实,即您在第二页甚至最后一页上看到的最后一个代码是相同的。你觉得这有悖常理吗?
六、关注
其实不然,这是很正常的事情,很多页面会被做成动态的,使用json或者其他文件传输数据(不准确,也可能使用java,javascript等代码调用端口等),这样就可以了更安全。这时候很多人会选择使用fiddle等第三方软件抓包,比较方便,但是这里笔者比较吃力,所以直接在控制器平台上观看即可。经过一番搜索,我们锁定了几个我们需要的文件和 xhr 文件。
很多网页的数据都会隐藏在json中。这可能是一样的吗?当然检查后失败了,然后我们看xhr,发现这个很熟悉的字段(当然我可能很熟悉)
显而易见的答案就在这里,只需解释一下
get historylist ,获取历史数据tk,我猜是万科的quantio语句(不知道这个词是不是拼错了,不过我用的很少,前后端相关的朋友可能知道) lemmald 这不是万科在百度的数字嘛,一看就知道是第七个页面大小,显示25条消息
这个发现很棒,解决了很多问题。
七、假的
作为爬虫,了解反爬虫套路是非常有必要的。如果你在xhr上进行正常爬虫,你会发现返回给你的是{error: xxxxx},此时你应该警惕,这证明你的机器人的身份被百度识破了,它拒绝了给你数据,所以我们需要做一些简单的伪装。前面已经讲过改头文件了,这次我会多讲。
1.headers 伪装,服务器使用它来确定您正在使用的浏览器。当出现这种情况时,服务器会认为这是来自浏览器的正常请求。2.Referer:浏览器使用它来确定您从哪个网页跳转。3.ip伪装,这个只要建好ip池就没有问题。建议去西刺代理检查一些需要的4.Cookie伪装,cookie是服务器用来识别你当前状态的,比如你登录了,什么,每次请求cookie从服务器,它将相应地更新。
最常用的就是上面这些了,从上到下越来越难调整了。面对百度,光改headers显然是不够的,于是加了Referer和cookie码(关键是两个月前就建立了。IP池已经废掉了,懒得整)。好了,到这里我们发现可以正常获取数据了。
八、文本匹配
不得不说,在解决了以上问题之后,文本匹配就变成了最简单的事情。
其实这是一种类似字典的格式,但是作者懒得想了,决定用一个简单粗暴的正则表达式。
九、转换时间戳
这时候我们就会发现,creattime给出的时间到底是什么鬼?但如果你仔细想想,你会发现它是一个时间戳
python 中的时间戳:自 1/1/1970 12:00AM 以来的秒数
是不是很破?幸运的是,解决这个问题只需要几段简短的代码
输入时间戳,好了,问题解决了。
十、绘图和csv
图片
CSV
十个一、总结和代码
感觉这次爬虫还行。两个多月后想起来也不容易。写这个博客纯粹是一个评论。至于怎么做图和怎么做csv的原因,我可以说博主是不是突然不想写了?
以下为代码:(注:博主懒得写评论了,不明白的可以评论提问,谢谢)
原创地址:%257b%2522重量%255fid%2522%253a%25226780366574501%2522%252℃%2522%252℃2522%2522%253a%25222014071 <4. pc%255pl%2522%257d&request_id = 6780366574501& biz_id = 0 & utm_medium。=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-12-80112434.pc_search_result_cache&utm_term=java%E7%88%AC%E8%99%AB 查看全部
动态网页抓取(爬取百度百科的历史记录,结果在时隔四个月之后再次遇到的对手)
动态页面爬取
很久没有写爬虫了。今天敲了一个爬虫——爬百度百科的历史记录。结果时隔四个月再次遇到的对手居然是动态页面(我一开始觉得百度太简单了。),但经过一番努力,还是达到了自己的目标,然后就写了博客作为评论。
一、概念
动态页面实际上是相对于静态页面的。面对静态页面时,直接查看响应一般是网页的整个代码,而动态页面则不然。一般来说,当再次打开动态页面的响应时,会与您在网页上看到的有所不同。
二、练习和练习前
因为我很喜欢练习,所以我会一言不发地练习,练习会给你真正的知识,你多练习就会明白。
目标网页:万科百度百科历史版本实现环境:win32版本:python3.6.2 实际目标:获取万科百度百科历史版本历史修改时间并制作图表或csv文件
三、流程说明
和所有爬虫一样,我们的第一步会是分析网页,因为我们的目标选择的是动态网页,所以我们还需要跟踪json文件等等。过程:
1、网页分析2、查询跟踪json等文件或xhr 3、文本匹配4、绘制或制作csv
四、工具准备
我们需要的库是(所有最新版本):
1.requests 2.re(以下库对于爬虫来说不是必需的,但它们是我这次需要的)3.matplotlib(用于可视化)4.datetime(用于时间操作)5.Pandas(python强大的数据处理库)6.os(系统操作)(我更喜欢原来的re库,当然这里用正则表达式可以解决所有问题)
你需要知道的:
1.python语法基础2.正则表达式匹配规则(以下不是爬虫必备)3.datetime一些基本功能4.matplotlib可视化操作(虽然这不是爬虫必须的,但很多情况下,数据可视化会让数据更直观,更容易做出判断)5.pandas库的基本使用(非爬虫必备,但数据分析必须学会)
五、网页分析
首先我们打开我们的目标页面→万科百度百科历史版。
好像一切正常,然后我们查看url,也有前面提到的规则,但是真的一切正常吗?
如果你把这个页面做为静态页面,那肯定是完蛋了,因为我一开始就是这样做的,当你在第一页查找代码时,你会发现一切正常,但是当你在第二页查找代码时page 有时,您会发现一个事实,即您在第二页甚至最后一页上看到的最后一个代码是相同的。你觉得这有悖常理吗?
六、关注
其实不然,这是很正常的事情,很多页面会被做成动态的,使用json或者其他文件传输数据(不准确,也可能使用java,javascript等代码调用端口等),这样就可以了更安全。这时候很多人会选择使用fiddle等第三方软件抓包,比较方便,但是这里笔者比较吃力,所以直接在控制器平台上观看即可。经过一番搜索,我们锁定了几个我们需要的文件和 xhr 文件。
很多网页的数据都会隐藏在json中。这可能是一样的吗?当然检查后失败了,然后我们看xhr,发现这个很熟悉的字段(当然我可能很熟悉)
显而易见的答案就在这里,只需解释一下
get historylist ,获取历史数据tk,我猜是万科的quantio语句(不知道这个词是不是拼错了,不过我用的很少,前后端相关的朋友可能知道) lemmald 这不是万科在百度的数字嘛,一看就知道是第七个页面大小,显示25条消息
这个发现很棒,解决了很多问题。
七、假的
作为爬虫,了解反爬虫套路是非常有必要的。如果你在xhr上进行正常爬虫,你会发现返回给你的是{error: xxxxx},此时你应该警惕,这证明你的机器人的身份被百度识破了,它拒绝了给你数据,所以我们需要做一些简单的伪装。前面已经讲过改头文件了,这次我会多讲。
1.headers 伪装,服务器使用它来确定您正在使用的浏览器。当出现这种情况时,服务器会认为这是来自浏览器的正常请求。2.Referer:浏览器使用它来确定您从哪个网页跳转。3.ip伪装,这个只要建好ip池就没有问题。建议去西刺代理检查一些需要的4.Cookie伪装,cookie是服务器用来识别你当前状态的,比如你登录了,什么,每次请求cookie从服务器,它将相应地更新。
最常用的就是上面这些了,从上到下越来越难调整了。面对百度,光改headers显然是不够的,于是加了Referer和cookie码(关键是两个月前就建立了。IP池已经废掉了,懒得整)。好了,到这里我们发现可以正常获取数据了。
八、文本匹配
不得不说,在解决了以上问题之后,文本匹配就变成了最简单的事情。
其实这是一种类似字典的格式,但是作者懒得想了,决定用一个简单粗暴的正则表达式。
九、转换时间戳
这时候我们就会发现,creattime给出的时间到底是什么鬼?但如果你仔细想想,你会发现它是一个时间戳
python 中的时间戳:自 1/1/1970 12:00AM 以来的秒数
是不是很破?幸运的是,解决这个问题只需要几段简短的代码
输入时间戳,好了,问题解决了。
十、绘图和csv
图片
CSV
十个一、总结和代码
感觉这次爬虫还行。两个多月后想起来也不容易。写这个博客纯粹是一个评论。至于怎么做图和怎么做csv的原因,我可以说博主是不是突然不想写了?
以下为代码:(注:博主懒得写评论了,不明白的可以评论提问,谢谢)
原创地址:%257b%2522重量%255fid%2522%253a%25226780366574501%2522%252℃%2522%252℃2522%2522%253a%25222014071 <4. pc%255pl%2522%257d&request_id = 6780366574501& biz_id = 0 & utm_medium。=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-12-80112434.pc_search_result_cache&utm_term=java%E7%88%AC%E8%99%AB
动态网页抓取(什么是动态URL动态页面的动态链接有什么特点)
网站优化 • 优采云 发表了文章 • 0 个评论 • 75 次浏览 • 2022-04-03 20:05
什么是动态网址
动态网址就是动态页面,动态链接是指带有“?”等参数符号的网址 在 URL 中并以 aspx、asp、jsp、php、perl 和 cgi 为后缀。
动态网址有什么特点
1、在构建反向链接的过程中,动态 URL 不如静态 URL 有利,因为它们不是永久性的。
2、动态 URL 对搜索引擎的好处不如静态 URL。
3、动态URL的生成是采集数据库的内容,所以无法保证网页内容的稳定性和链接的持久性,很难被搜索引擎 收录。
动态 URL 的优点
1、相同类型的网页使用相同的URL类型,只是调用参数不同。比如列表页和文章页,管理方便,可以知道网页的类型是列表页还是内容页。
2、动态URL中的参数可以提示搜索引擎。搜索引擎在抓取页面时更容易理解页面的主题,就像 URL 收录 关键词 一样。搜索引擎有能力识别后面的参数,这有利于网页的关键词排名。
3、网站物理结构变平了。所有网页使用同一个页面调用,页面最多有两级目录结构,方便管理,提高处理速度。
动态 URL 的缺点
1、动态网址相对传播难度较大,参数过多用户比较反感。在站点外传播时,用户信任度会低于静态 URL。
在搜索引擎中,动态 URL 的信任度也比静态 URL 略低,因为动态 URL 比静态 URL 更不稳定且更不稳定。
2、动态网址中的参数可能会导致搜索引擎蜘蛛死循环爬行,造成搜索引擎和服务器资源的巨大浪费。
搜索引擎一般对动态 URL 的信任度不够,所以很多动态 URL 的网页不可能是收录。
3、如果动态URL中的参数顺序颠倒,或者网页设置访问SessionID,这些相同的网页将被视为不同的页面。
会导致搜索引擎认为网站上存在大量重复内容,可能会影响收录和正常网页的排名,甚至会被误判。所以做SEO最好做静态URL。
本文的读者还可以阅读:
如何计算搜索引擎的质量网站
什么是搜索引擎优化?如何做好SEO?
如何从SEO角度选择一个好的域名
如何优化关键词? 查看全部
动态网页抓取(什么是动态URL动态页面的动态链接有什么特点)
什么是动态网址
动态网址就是动态页面,动态链接是指带有“?”等参数符号的网址 在 URL 中并以 aspx、asp、jsp、php、perl 和 cgi 为后缀。
动态网址有什么特点
1、在构建反向链接的过程中,动态 URL 不如静态 URL 有利,因为它们不是永久性的。
2、动态 URL 对搜索引擎的好处不如静态 URL。
3、动态URL的生成是采集数据库的内容,所以无法保证网页内容的稳定性和链接的持久性,很难被搜索引擎 收录。
动态 URL 的优点
1、相同类型的网页使用相同的URL类型,只是调用参数不同。比如列表页和文章页,管理方便,可以知道网页的类型是列表页还是内容页。
2、动态URL中的参数可以提示搜索引擎。搜索引擎在抓取页面时更容易理解页面的主题,就像 URL 收录 关键词 一样。搜索引擎有能力识别后面的参数,这有利于网页的关键词排名。
3、网站物理结构变平了。所有网页使用同一个页面调用,页面最多有两级目录结构,方便管理,提高处理速度。
动态 URL 的缺点
1、动态网址相对传播难度较大,参数过多用户比较反感。在站点外传播时,用户信任度会低于静态 URL。
在搜索引擎中,动态 URL 的信任度也比静态 URL 略低,因为动态 URL 比静态 URL 更不稳定且更不稳定。
2、动态网址中的参数可能会导致搜索引擎蜘蛛死循环爬行,造成搜索引擎和服务器资源的巨大浪费。
搜索引擎一般对动态 URL 的信任度不够,所以很多动态 URL 的网页不可能是收录。
3、如果动态URL中的参数顺序颠倒,或者网页设置访问SessionID,这些相同的网页将被视为不同的页面。
会导致搜索引擎认为网站上存在大量重复内容,可能会影响收录和正常网页的排名,甚至会被误判。所以做SEO最好做静态URL。
本文的读者还可以阅读:
如何计算搜索引擎的质量网站
什么是搜索引擎优化?如何做好SEO?
如何从SEO角度选择一个好的域名
如何优化关键词?
动态网页抓取(ASP、ASP.NET、PHP、JSP,哪个好?)
网站优化 • 优采云 发表了文章 • 0 个评论 • 72 次浏览 • 2022-04-03 20:03
目前动态网站开发主要有4种语言:ASP、ASP.NET、PHP、JSP。
1、ASP 代表 Active Server Pages,它是由 Microsoft 开发的超文本标记语言 (HTML)、脚本和 CGI(通用网关接口)的组合。它不提供自己专门的编程语言,但允许用户使用许多现有的脚本语言来编写 ASP 应用程序。ASP 编程比 HTML 更方便、更灵活。它运行在 Web 服务器端,然后将运行结果以 HTML 格式发送到客户端的浏览器。因此,ASP 比一般的脚本语言安全得多。
ASP最大的优点是可以收录HTML标签,也可以直接访问数据库,使用无限扩展的ActiveX控件,所以在编程上比HTML更方便、更灵活。通过使用ASP的组件和对象技术,用户可以直接使用ActiveX控件,调用对象方法和属性,以简单的方式实现强大的交互功能。
但是ASP技术也不是很完善。因为它基本上受限于微软的操作系统平台,主要的工作环境是微软的IIS应用程序结构,而且由于ActiveX对象具有平台特性,ASP技术不能轻易实现。在跨平台 Web 服务器上工作。
面向过程的程序开发方法使维护变得更加困难,特别是对于大型 ASP 应用程序。解释VBScript或JScript语言,使性能不能充分发挥。由于缺乏其基础设施,扩展性受到限制,虽然有COM组件可用,但在开发一些特殊功能(如文件上传)时,没有来自内置的支持,需要向第三方寻求控制控制供应商。
3、PHP 是超文本预处理器。它是当今 Internet 上最流行的脚本语言。它的语法借鉴了C、Java、PERL等语言,但只需要一点编程知识。可以使用 PHP 构建一个真正的交互式网站。
它对HTML语言有很好的兼容性,用户可以直接在脚本代码中添加HTML标签,或者在HTML标签中添加脚本代码,更好地实现页面控制。PHP提供标准的数据库接口,数据库连接方便,兼容性强;扩展性强;可以进行面向对象的编程。
4、JSP全称Java Server Pages(Java服务器页面),是1999年6月推出的一项新技术,是一种基于Java Servlet和整个Java(Java)系统的Web开发技术。
JSP和ASP在技术上有很多相似之处,但是来自不同的技术规范组织,所以ASP一般只用在Windows NT/2000平台上,而JSP可以运行在85%以上的服务器上,并且是基于JSP技术的应用程序比基于 ASP 的应用程序更易于维护和管理,因此被许多人认为是未来最有前途的动态 网站 技术。 查看全部
动态网页抓取(ASP、ASP.NET、PHP、JSP,哪个好?)
目前动态网站开发主要有4种语言:ASP、ASP.NET、PHP、JSP。
1、ASP 代表 Active Server Pages,它是由 Microsoft 开发的超文本标记语言 (HTML)、脚本和 CGI(通用网关接口)的组合。它不提供自己专门的编程语言,但允许用户使用许多现有的脚本语言来编写 ASP 应用程序。ASP 编程比 HTML 更方便、更灵活。它运行在 Web 服务器端,然后将运行结果以 HTML 格式发送到客户端的浏览器。因此,ASP 比一般的脚本语言安全得多。
ASP最大的优点是可以收录HTML标签,也可以直接访问数据库,使用无限扩展的ActiveX控件,所以在编程上比HTML更方便、更灵活。通过使用ASP的组件和对象技术,用户可以直接使用ActiveX控件,调用对象方法和属性,以简单的方式实现强大的交互功能。
但是ASP技术也不是很完善。因为它基本上受限于微软的操作系统平台,主要的工作环境是微软的IIS应用程序结构,而且由于ActiveX对象具有平台特性,ASP技术不能轻易实现。在跨平台 Web 服务器上工作。
面向过程的程序开发方法使维护变得更加困难,特别是对于大型 ASP 应用程序。解释VBScript或JScript语言,使性能不能充分发挥。由于缺乏其基础设施,扩展性受到限制,虽然有COM组件可用,但在开发一些特殊功能(如文件上传)时,没有来自内置的支持,需要向第三方寻求控制控制供应商。
3、PHP 是超文本预处理器。它是当今 Internet 上最流行的脚本语言。它的语法借鉴了C、Java、PERL等语言,但只需要一点编程知识。可以使用 PHP 构建一个真正的交互式网站。
它对HTML语言有很好的兼容性,用户可以直接在脚本代码中添加HTML标签,或者在HTML标签中添加脚本代码,更好地实现页面控制。PHP提供标准的数据库接口,数据库连接方便,兼容性强;扩展性强;可以进行面向对象的编程。
4、JSP全称Java Server Pages(Java服务器页面),是1999年6月推出的一项新技术,是一种基于Java Servlet和整个Java(Java)系统的Web开发技术。
JSP和ASP在技术上有很多相似之处,但是来自不同的技术规范组织,所以ASP一般只用在Windows NT/2000平台上,而JSP可以运行在85%以上的服务器上,并且是基于JSP技术的应用程序比基于 ASP 的应用程序更易于维护和管理,因此被许多人认为是未来最有前途的动态 网站 技术。
动态网页抓取(介绍使用BeautifulSoup抓取静态网页,使用Selenium-WebDriver抓取动态网页 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 81 次浏览 • 2022-04-03 19:12
)
介绍使用Beautiful Soup爬取静态网页和使用Selenium-WebDriver爬取动态网页
# 环境
import requests
# post body
body = {
"ck": '',
"area_code": "+86",
"number": "18797811992",
"analytics": "analytics_log"
}
# 请求头
headers = {
"Host": "accounts.douban.com",
"Origin": "https://accounts.douban.com",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
"Content-Type": "application/x-www-form-urlencoded",
"Referer": "https://accounts.douban.com/pa ... ot%3B,
"Accept-Language": "zh,en-US;q=0.9,en;q=0.8,zh-CN;q=0.7",
"Cache-Control": "no-cache",
"Connection": "keep-alive"
}
# URL参数
params = {
"k": "v",
"k2": "v2"
}
# 发送POST请求,设置请求方式,请求地址,请求体,请求头,请求参数,超时时间(单位为秒)
response = requests.post("https://accounts.douban.com/j/ ... ot%3B, data=body, headers=headers,
params=params, timeout=1)
# 相应的编码
print(response.encoding)
# 响应的状态
print(response.status_code)
# 响应的内容,根据头部字符编码进行解码
print(response.text)
# 响应的二进制形式,如读取文件
print(response.content)
# 将响应解析为json
print(response.json())
Beautiful Soup 是一个 Python 库,用于从 HTML 或 XML 文件中提取数据。它支持通过您最喜欢的转换器导航、查找和修改文档的惯用方式。Beautiful Soup 将为您节省数小时甚至数天的营业时间。
#爬虫演示#静态网络爬虫演示:
import requests
from bs4 import BeautifulSoup
# 请求URL
response = requests.get("http://www.santostang.com")
# 将响应传给bs4
bs = BeautifulSoup(response.text, "html.parser")
# 查找所有class为`article-list-1 clearfix`的article元素
article_list = bs.find_all("article", class_="article-list-1 clearfix")
# 将文本写入到csv文件中
with open("article_title.csv", "a") as article_file:
for article in article_list:
# 打印获取到的文本
title = article.header.h1.a.text
print(title)
# 写入
article_file.write(title + ",")
article_file.write("\n")
# 抓取动态网页
与静态网页相比,动态网页的内容不会出现在 HTML 源代码中。所以需要使用动态网页抓取技术:使用 Selenium-webDriver 模拟浏览器行为
Selenium 有许多功能,但其核心是一个用于 Web 浏览器自动化的工具集,它使用最好的技术来远程控制浏览器实例并模拟用户与浏览器的交互。
下载对应的驱动,根据浏览器和操作系统进行配置:
图像.png
网元
一个 WebElement 代表一个 DOM 元素。可以通过使用 WebDriver 实例从文档根节点搜索或通过在另一个 WebElement 下搜索来找到 WebElement。
WebDriver API 提供内置方法来根据不同的属性(例如 ID、名称、类、XPath、CSS 选择器、链接文本等)查找 WebElement。
from selenium.webdriver import Chrome
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
# 实例化驱动程序,并指定驱动程序地址(默认也会取PATH中配的值)
chrome_driver = Chrome(executable_path="/opt/WebDriver/bin/chromedriver")
try:
url = "http://www.baidu.com"
# 最大化窗口
chrome_driver.maximize_window()
# 打开网站
chrome_driver.get(url)
print("当前的URL为:" + chrome_driver.current_url)
# 等待DOM渲染完成
# WebDriverWait(chrome_driver).until()
# 获取input输入框元素
input_el = chrome_driver.find_element_by_id("kw")
# 在输入框输入文本
input_el.send_keys("Selenium WebDriver自动输入")
# 获取`百度一下`按钮
search_btn = chrome_driver.find_element_by_id("su")
# 模拟点击事件
search_btn.click()
# 这时候已经到另外一个页面了===========
# 搜索结果页的输入框
search_result = chrome_driver.find_element_by_id("kw")
# 清除数据
search_result.clear()
# 等待网页渲染完成,不然可能导致无法查询到想要获取的元素的异常
WebDriverWait(chrome_driver, 5, 0.2).until(EC.presence_of_all_elements_located((By.TAG_NAME, "a")))
WebDriverWait(chrome_driver, 5, 0.2).until(EC.presence_of_all_elements_located((By.ID, "1")))
# 第一条搜索结果
result_item_1 = chrome_driver.find_element_by_id("1")
a_link = result_item_1.find_element_by_tag_name("h3").find_element_by_tag_name("a")
# 根据a标签的href跳转到新的网页
a_link_href = a_link.get_property("href")
print("即将跳转的链接地址为:" + a_link_href)
chrome_driver.get(a_link_href)
# 刷新
chrome_driver.refresh()
# 屏幕截图
chrome_driver.save_screenshot("./屏幕截图.png")
finally:
# 退出浏览器
chrome_driver.quit() 查看全部
动态网页抓取(介绍使用BeautifulSoup抓取静态网页,使用Selenium-WebDriver抓取动态网页
)
介绍使用Beautiful Soup爬取静态网页和使用Selenium-WebDriver爬取动态网页
# 环境
import requests
# post body
body = {
"ck": '',
"area_code": "+86",
"number": "18797811992",
"analytics": "analytics_log"
}
# 请求头
headers = {
"Host": "accounts.douban.com",
"Origin": "https://accounts.douban.com",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
"Content-Type": "application/x-www-form-urlencoded",
"Referer": "https://accounts.douban.com/pa ... ot%3B,
"Accept-Language": "zh,en-US;q=0.9,en;q=0.8,zh-CN;q=0.7",
"Cache-Control": "no-cache",
"Connection": "keep-alive"
}
# URL参数
params = {
"k": "v",
"k2": "v2"
}
# 发送POST请求,设置请求方式,请求地址,请求体,请求头,请求参数,超时时间(单位为秒)
response = requests.post("https://accounts.douban.com/j/ ... ot%3B, data=body, headers=headers,
params=params, timeout=1)
# 相应的编码
print(response.encoding)
# 响应的状态
print(response.status_code)
# 响应的内容,根据头部字符编码进行解码
print(response.text)
# 响应的二进制形式,如读取文件
print(response.content)
# 将响应解析为json
print(response.json())
Beautiful Soup 是一个 Python 库,用于从 HTML 或 XML 文件中提取数据。它支持通过您最喜欢的转换器导航、查找和修改文档的惯用方式。Beautiful Soup 将为您节省数小时甚至数天的营业时间。
#爬虫演示#静态网络爬虫演示:
import requests
from bs4 import BeautifulSoup
# 请求URL
response = requests.get("http://www.santostang.com")
# 将响应传给bs4
bs = BeautifulSoup(response.text, "html.parser")
# 查找所有class为`article-list-1 clearfix`的article元素
article_list = bs.find_all("article", class_="article-list-1 clearfix")
# 将文本写入到csv文件中
with open("article_title.csv", "a") as article_file:
for article in article_list:
# 打印获取到的文本
title = article.header.h1.a.text
print(title)
# 写入
article_file.write(title + ",")
article_file.write("\n")
# 抓取动态网页
与静态网页相比,动态网页的内容不会出现在 HTML 源代码中。所以需要使用动态网页抓取技术:使用 Selenium-webDriver 模拟浏览器行为
Selenium 有许多功能,但其核心是一个用于 Web 浏览器自动化的工具集,它使用最好的技术来远程控制浏览器实例并模拟用户与浏览器的交互。
下载对应的驱动,根据浏览器和操作系统进行配置:

图像.png
网元
一个 WebElement 代表一个 DOM 元素。可以通过使用 WebDriver 实例从文档根节点搜索或通过在另一个 WebElement 下搜索来找到 WebElement。
WebDriver API 提供内置方法来根据不同的属性(例如 ID、名称、类、XPath、CSS 选择器、链接文本等)查找 WebElement。
from selenium.webdriver import Chrome
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
# 实例化驱动程序,并指定驱动程序地址(默认也会取PATH中配的值)
chrome_driver = Chrome(executable_path="/opt/WebDriver/bin/chromedriver")
try:
url = "http://www.baidu.com"
# 最大化窗口
chrome_driver.maximize_window()
# 打开网站
chrome_driver.get(url)
print("当前的URL为:" + chrome_driver.current_url)
# 等待DOM渲染完成
# WebDriverWait(chrome_driver).until()
# 获取input输入框元素
input_el = chrome_driver.find_element_by_id("kw")
# 在输入框输入文本
input_el.send_keys("Selenium WebDriver自动输入")
# 获取`百度一下`按钮
search_btn = chrome_driver.find_element_by_id("su")
# 模拟点击事件
search_btn.click()
# 这时候已经到另外一个页面了===========
# 搜索结果页的输入框
search_result = chrome_driver.find_element_by_id("kw")
# 清除数据
search_result.clear()
# 等待网页渲染完成,不然可能导致无法查询到想要获取的元素的异常
WebDriverWait(chrome_driver, 5, 0.2).until(EC.presence_of_all_elements_located((By.TAG_NAME, "a")))
WebDriverWait(chrome_driver, 5, 0.2).until(EC.presence_of_all_elements_located((By.ID, "1")))
# 第一条搜索结果
result_item_1 = chrome_driver.find_element_by_id("1")
a_link = result_item_1.find_element_by_tag_name("h3").find_element_by_tag_name("a")
# 根据a标签的href跳转到新的网页
a_link_href = a_link.get_property("href")
print("即将跳转的链接地址为:" + a_link_href)
chrome_driver.get(a_link_href)
# 刷新
chrome_driver.refresh()
# 屏幕截图
chrome_driver.save_screenshot("./屏幕截图.png")
finally:
# 退出浏览器
chrome_driver.quit()
动态网页抓取(爬虫的动态处理方法(我用较为简单的一些网址举例比如豆瓣的热门电影))
网站优化 • 优采云 发表了文章 • 0 个评论 • 79 次浏览 • 2022-04-03 19:10
前言
爬虫的动态处理方式(我以一些比较简单的网址为例,比如豆瓣的热门电影)
一、动态爬虫
动态爬虫和静态爬虫最大的区别在于源代码与网页内容不同。动态爬虫可以抓包(即直接使用浏览器的F12抓包获取相关文件)
二、使用步骤1.先通过网址找到你需要的
截图如下(示例):按F12进入开发者模式,第二步点击左上角刷新重新加载内容,第三步在红框中选择需要的内容,然后你可以使用“预览”查看是否对应
搜索无误后,在“Header”中找到“Request URL”和“User-Agent”。找到这些之后,基本的工作就差不多完成了。
2.代码段
先导入需要的库
代码显示如下:
import re
import urllib.request
import pandas as pd
这是我使用的一些库
url=('https://movie.douban.com/j/sea ... %2339;)
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36' }
requests=urllib.request.Request(url,headers=headers)
respon=urllib.request.urlopen(requests)
html=respon.read().decode('utf-8')
上面的代码是获取对应网页的内容
然后只需搜索您需要的内容。
3.完整代码
url=('https://movie.douban.com/j/sea ... %2339;)
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36' }
requests=urllib.request.Request(url,headers=headers)
respon=urllib.request.urlopen(requests)
html=respon.read().decode('utf-8')
photo=re.compile(r'"cover":"(.*?),"id"')
list1=re.findall(photo,html)
name=re.compile(r'"title":"(.*?)",')
list2=re.findall(name,html)
# print(html)
rat=re.compile(r'"rate":"(.*?),')
list3=re.findall(rat,html)
xx={'电影名':list2,'评分':list3}
df=pd.DataFrame(xx,index=range(1,51))
print(df)
总结
以上就是我今天要讲的内容。本文仅简单介绍动态爬虫的方法。我希望它会有所帮助。 查看全部
动态网页抓取(爬虫的动态处理方法(我用较为简单的一些网址举例比如豆瓣的热门电影))
前言
爬虫的动态处理方式(我以一些比较简单的网址为例,比如豆瓣的热门电影)
一、动态爬虫
动态爬虫和静态爬虫最大的区别在于源代码与网页内容不同。动态爬虫可以抓包(即直接使用浏览器的F12抓包获取相关文件)
二、使用步骤1.先通过网址找到你需要的

截图如下(示例):按F12进入开发者模式,第二步点击左上角刷新重新加载内容,第三步在红框中选择需要的内容,然后你可以使用“预览”查看是否对应

搜索无误后,在“Header”中找到“Request URL”和“User-Agent”。找到这些之后,基本的工作就差不多完成了。
2.代码段
先导入需要的库
代码显示如下:
import re
import urllib.request
import pandas as pd
这是我使用的一些库
url=('https://movie.douban.com/j/sea ... %2339;)
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36' }
requests=urllib.request.Request(url,headers=headers)
respon=urllib.request.urlopen(requests)
html=respon.read().decode('utf-8')
上面的代码是获取对应网页的内容
然后只需搜索您需要的内容。
3.完整代码
url=('https://movie.douban.com/j/sea ... %2339;)
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36' }
requests=urllib.request.Request(url,headers=headers)
respon=urllib.request.urlopen(requests)
html=respon.read().decode('utf-8')
photo=re.compile(r'"cover":"(.*?),"id"')
list1=re.findall(photo,html)
name=re.compile(r'"title":"(.*?)",')
list2=re.findall(name,html)
# print(html)
rat=re.compile(r'"rate":"(.*?),')
list3=re.findall(rat,html)
xx={'电影名':list2,'评分':list3}
df=pd.DataFrame(xx,index=range(1,51))
print(df)
总结
以上就是我今天要讲的内容。本文仅简单介绍动态爬虫的方法。我希望它会有所帮助。
动态网页抓取(动态抓取在开始动态网页之前吗,我们还需要了解 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2022-04-01 09:26
)
动态爬取
在开始爬取动态网页之前,我们还需要了解一个更新的技术——AJAX(Asynchronous Javascript And XML)。它的价值在于可以通过在后台与服务器交换少量数据来异步更新网页。这意味着可以在不重新加载整个页面的情况下更新页面的某些部分。一方面减少了网页重复内容的下载,另一方面节省了流量,因此得到了广泛的应用。
如果使用AJAX加载动态网页,如何抓取里面动态加载的内容?有两种方法:
(1)通过浏览器检查元素解析地址
(2) 模拟浏览器通过 selenium 爬行
#使用selenium打开浏览器和一个网页
from selenium import webdriver
driver=webdriver.Firefox()
driver.get("http://www.dianping.com/search ... 6quot;)
使用 json 库
从 json 数据中提取注释,上面的结果相当混乱。其实这些都是json数据。我们可以使用 json 库来解析数据并从中提取所需的数据。
import json
json_data=json.loads(r.text) #使用jison.loads把字符串格式得响应体数据转化为json数据。
comment_list=json_data['data']['comments'] #利用接送数据得 结构提取评论的列表comment_list
for eachone in comment_list: #最后用for循环提取其中得评论文本
message=comment_list[eachone]['content']
print(message) 查看全部
动态网页抓取(动态抓取在开始动态网页之前吗,我们还需要了解
)
动态爬取
在开始爬取动态网页之前,我们还需要了解一个更新的技术——AJAX(Asynchronous Javascript And XML)。它的价值在于可以通过在后台与服务器交换少量数据来异步更新网页。这意味着可以在不重新加载整个页面的情况下更新页面的某些部分。一方面减少了网页重复内容的下载,另一方面节省了流量,因此得到了广泛的应用。
如果使用AJAX加载动态网页,如何抓取里面动态加载的内容?有两种方法:
(1)通过浏览器检查元素解析地址
(2) 模拟浏览器通过 selenium 爬行
#使用selenium打开浏览器和一个网页
from selenium import webdriver
driver=webdriver.Firefox()
driver.get("http://www.dianping.com/search ... 6quot;)
使用 json 库
从 json 数据中提取注释,上面的结果相当混乱。其实这些都是json数据。我们可以使用 json 库来解析数据并从中提取所需的数据。
import json
json_data=json.loads(r.text) #使用jison.loads把字符串格式得响应体数据转化为json数据。
comment_list=json_data['data']['comments'] #利用接送数据得 结构提取评论的列表comment_list
for eachone in comment_list: #最后用for循环提取其中得评论文本
message=comment_list[eachone]['content']
print(message)
动态网页抓取(IP地址是一种32位二进制数的地址,你知道吗?)
网站优化 • 优采云 发表了文章 • 0 个评论 • 56 次浏览 • 2022-03-31 15:01
IP 地址是一个 32 位二进制数地址,理论上大约有 40 亿(2 的 32 次方)可能的地址组合,这似乎是一个很大的地址空间。实际上,根据网络ID和主机ID的不同位规则,IP地址可以分为A(8位网络ID和24位主机ID)、B(16位网络ID和16位主机ID) ), C (24-bit network ID and 16-bit host ID) 由于历史原因和技术发展的差异,A类地址和B类地址几乎被完全分配,只有C类地址可以被周围的组织分配世界。所以IP地址是非常重要的网络资源。
对于已经建立互联网服务的机构,由于其主机开通了WWW、FTP、E-mail等访问服务,通常会公布一个固定的IP地址,方便用户访问。当然,数字IP不方便记忆和识别,人们更习惯通过域名访问主机,而域名仍然需要通过域名服务器(DNS)翻译成IP地址。比如你的主页地址很容易被用户记住和使用,域名服务器会将这个域名翻译成101.12.123.234,即您的在线形象的真实地址。
对于大多数拨号上网的用户来说,由于上网的时间和空间的离散性,给每个用户分配一个固定的IP地址(静态IP)是非常不可取的,这样会造成IP地址资源的极大浪费。因此,这些用户通常在拨打 ISP 的主机后会自动获得一个动态 IP 地址。当然,地址不是任意的,而是ISP申请的网络ID和主机ID合法范围内的地址。拨号用户的IP地址在任意两次连接中都可能不同,但每次连接时IP地址都保持不变。 查看全部
动态网页抓取(IP地址是一种32位二进制数的地址,你知道吗?)
IP 地址是一个 32 位二进制数地址,理论上大约有 40 亿(2 的 32 次方)可能的地址组合,这似乎是一个很大的地址空间。实际上,根据网络ID和主机ID的不同位规则,IP地址可以分为A(8位网络ID和24位主机ID)、B(16位网络ID和16位主机ID) ), C (24-bit network ID and 16-bit host ID) 由于历史原因和技术发展的差异,A类地址和B类地址几乎被完全分配,只有C类地址可以被周围的组织分配世界。所以IP地址是非常重要的网络资源。
对于已经建立互联网服务的机构,由于其主机开通了WWW、FTP、E-mail等访问服务,通常会公布一个固定的IP地址,方便用户访问。当然,数字IP不方便记忆和识别,人们更习惯通过域名访问主机,而域名仍然需要通过域名服务器(DNS)翻译成IP地址。比如你的主页地址很容易被用户记住和使用,域名服务器会将这个域名翻译成101.12.123.234,即您的在线形象的真实地址。
对于大多数拨号上网的用户来说,由于上网的时间和空间的离散性,给每个用户分配一个固定的IP地址(静态IP)是非常不可取的,这样会造成IP地址资源的极大浪费。因此,这些用户通常在拨打 ISP 的主机后会自动获得一个动态 IP 地址。当然,地址不是任意的,而是ISP申请的网络ID和主机ID合法范围内的地址。拨号用户的IP地址在任意两次连接中都可能不同,但每次连接时IP地址都保持不变。
动态网页抓取(【每日一题】代码中没有使用“下滑到页面底部” )
网站优化 • 优采云 发表了文章 • 0 个评论 • 57 次浏览 • 2022-03-31 02:11
)
代码中没有使用“滑动到页面底部”动作,即没有:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
这不会影响网页内容的抓取。
因为原书有这行代码,解析完iframe后,这行代码就不能用了,所以使用driver.switch_to.default_content()切换回原来未解析的iframe。
但是下面的代码中没有向下滑动的操作,所以不需要同时切换回iframe的代码。
<p> 1 from selenium import webdriver
2 import time
3
4 driver = webdriver.Chrome(executable_path = r'D:\Anaconda\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe')
5 driver.get("http://www.santostang.com/2018 ... 6quot;)
6
7 j=0
8 driver.switch_to.frame(driver.find_element_by_css_selector('iframe[title="livere-comment"]'))
9 driver.implicitly_wait(30)
10 while True:
11
12 #buttons为list类型,获取一屏中页面数量
13 buttons = driver.find_elements_by_css_selector('button.page-btn')
14 bSize = len(buttons)
15
16 for i in range(0,bSize):
17 #打开文件
18 file = open(r'C:\Users\rumin\Desktop\comment.txt','a+')
19 file.write('\n')
20 file.write('=====================第%d页评论========================\n'%(i+1+j*10))
21
22 #找到当前页所有comments
23 comments = driver.find_elements_by_css_selector('div.reply-content')
24 for item in comments:
25 comment = item.find_element_by_tag_name('p')
26 print(comment.text)
27 text = comment.text.encode('GBK', 'ignore').decode('GBk')
28 file.write(text+'\n')
29 time.sleep(2)
30 file.close()
31
32 if i 查看全部
动态网页抓取(【每日一题】代码中没有使用“下滑到页面底部”
)
代码中没有使用“滑动到页面底部”动作,即没有:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
这不会影响网页内容的抓取。
因为原书有这行代码,解析完iframe后,这行代码就不能用了,所以使用driver.switch_to.default_content()切换回原来未解析的iframe。
但是下面的代码中没有向下滑动的操作,所以不需要同时切换回iframe的代码。
<p> 1 from selenium import webdriver
2 import time
3
4 driver = webdriver.Chrome(executable_path = r'D:\Anaconda\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe')
5 driver.get("http://www.santostang.com/2018 ... 6quot;)
6
7 j=0
8 driver.switch_to.frame(driver.find_element_by_css_selector('iframe[title="livere-comment"]'))
9 driver.implicitly_wait(30)
10 while True:
11
12 #buttons为list类型,获取一屏中页面数量
13 buttons = driver.find_elements_by_css_selector('button.page-btn')
14 bSize = len(buttons)
15
16 for i in range(0,bSize):
17 #打开文件
18 file = open(r'C:\Users\rumin\Desktop\comment.txt','a+')
19 file.write('\n')
20 file.write('=====================第%d页评论========================\n'%(i+1+j*10))
21
22 #找到当前页所有comments
23 comments = driver.find_elements_by_css_selector('div.reply-content')
24 for item in comments:
25 comment = item.find_element_by_tag_name('p')
26 print(comment.text)
27 text = comment.text.encode('GBK', 'ignore').decode('GBk')
28 file.write(text+'\n')
29 time.sleep(2)
30 file.close()
31
32 if i
动态网页抓取(东莞网站优化如何更好的被百度蜘蛛抓取呢??)
网站优化 • 优采云 发表了文章 • 0 个评论 • 70 次浏览 • 2022-03-29 17:03
东莞网站优化如果你想让你的网站的更多页面是收录,你必须先让网页被百度蜘蛛抓取,可以收录我们先不说了,你得抢了才可以跟进收录。那么网站如何更好的被百度蜘蛛抓取?
1、保证网站高质量原创:网站的原创很重要,蜘蛛要爬很多网站一天,如果你的网站都是采集的东西,对它来说没有任何意义,这样的网站不仅招不到蜘蛛,更招不到用户。
2、保证网站的更新频率:新站点一上线,就会开始向网站添加原创内容。很多站长觉得新站上线了,网站没有内容,能不能一天加几十个文章到网站,这样搜索引擎就多了收录,新站会不会推出搜索引擎收录还是一样的,加这么多内容也没关系原创,要不是原创搜索引擎会想这样的 网站采集 网站没有新想法。
还有一点需要考虑,现在一天可以添加这么多内容,蜘蛛习惯了你网站每天添加这么多内容,当你一天不添加更多内容时,蜘蛛来找你网站吃不下可能会出现快照没有更新的情况,查看网站日志看看蜘蛛什么时候会来网站,确保网站有不错的更新频率,这样网站为了更好的吸引蜘蛛去抢。
3、保证网站有一个明确的关键词:蜘蛛来网站主要是通过网站关键词,站长经常是不可能的让蜘蛛清楚地知道这个 网站 的主要 关键词 是主要 关键词 的那个人。不能判断的蜘蛛不会给网站很高的权重,关键词的排名也不行。
所以为了吸引蜘蛛爬行网站,最后要确认关键词对于网站,网站的标题和描述要写清楚,并且同时在同一篇文章文章中网站的内链构造中,不要使用不同的关键词指向同一个页面,这样的内链构造是错误的。同时,首页的标题和内页的标题不能设置相同。主页设置为主关键词,内页标题设置为与文章关键词的标题相关,这样方便蜘蛛判断内页。页面也会赋予内页权重,因此吸引蜘蛛应该以明确的 关键词 开头。 查看全部
动态网页抓取(东莞网站优化如何更好的被百度蜘蛛抓取呢??)
东莞网站优化如果你想让你的网站的更多页面是收录,你必须先让网页被百度蜘蛛抓取,可以收录我们先不说了,你得抢了才可以跟进收录。那么网站如何更好的被百度蜘蛛抓取?
1、保证网站高质量原创:网站的原创很重要,蜘蛛要爬很多网站一天,如果你的网站都是采集的东西,对它来说没有任何意义,这样的网站不仅招不到蜘蛛,更招不到用户。
2、保证网站的更新频率:新站点一上线,就会开始向网站添加原创内容。很多站长觉得新站上线了,网站没有内容,能不能一天加几十个文章到网站,这样搜索引擎就多了收录,新站会不会推出搜索引擎收录还是一样的,加这么多内容也没关系原创,要不是原创搜索引擎会想这样的 网站采集 网站没有新想法。
还有一点需要考虑,现在一天可以添加这么多内容,蜘蛛习惯了你网站每天添加这么多内容,当你一天不添加更多内容时,蜘蛛来找你网站吃不下可能会出现快照没有更新的情况,查看网站日志看看蜘蛛什么时候会来网站,确保网站有不错的更新频率,这样网站为了更好的吸引蜘蛛去抢。
3、保证网站有一个明确的关键词:蜘蛛来网站主要是通过网站关键词,站长经常是不可能的让蜘蛛清楚地知道这个 网站 的主要 关键词 是主要 关键词 的那个人。不能判断的蜘蛛不会给网站很高的权重,关键词的排名也不行。
所以为了吸引蜘蛛爬行网站,最后要确认关键词对于网站,网站的标题和描述要写清楚,并且同时在同一篇文章文章中网站的内链构造中,不要使用不同的关键词指向同一个页面,这样的内链构造是错误的。同时,首页的标题和内页的标题不能设置相同。主页设置为主关键词,内页标题设置为与文章关键词的标题相关,这样方便蜘蛛判断内页。页面也会赋予内页权重,因此吸引蜘蛛应该以明确的 关键词 开头。
动态网页抓取( 网络营销教学网站将动态网页检索的一般特点简要:)
网站优化 • 优采云 发表了文章 • 0 个评论 • 74 次浏览 • 2022-03-29 05:16
网络营销教学网站将动态网页检索的一般特点简要:)
什么是动态网页和静态网页?
动态网页对应的是静态网页,也就是说网页网址的后缀并不是.等静态网页的常见形式。Perl、.cgi等形式都是后缀,还有一个标志性的符号——“?” 在动态网页 URL 中。如果有这样的动态网页,地址是:
这是一个典型的动态网页 URL 表单。
这里所说的动态网页与网页上的各种动画、滚动字幕等视觉“动态效果”没有直接关系。动态网页也可以是纯文本内容或收录各种动画。这些只是网页具体内容的呈现形式,无论网页是否具有动态效果,采用动态网站技术生成的网页都称为动态网页。
从网站查看者的角度来看,无论是动态网页还是静态网页,都可以展示基本的文字和图片信息,但从网站开发、管理、维护的角度来看,却是非常很难有大的区别。网络营销教学网站简单总结动态网页的一般特点如下:
(1)动态网页基于数据库技术,可以大大减少网站维护的工作量;
(2)网站使用动态web技术可以实现更多功能,如用户注册、用户登录、在线调查、用户管理、订单管理等;
(3)动态网页实际上并不是服务器上独立存在的网页文件,服务器只有在用户请求时才返回完整的网页;
(4)动态网页中的“?”对于搜索引擎检索有一定的问题,一般搜索引擎不可能从一个网站数据库中访问所有网页,或者出于技术考虑,搜索蜘蛛不会抓取URL中“?”后面的内容,所以使用动态网页的网站在推广搜索引擎时需要做一定的技术处理,以满足搜索引擎的要求。 查看全部
动态网页抓取(
网络营销教学网站将动态网页检索的一般特点简要:)
什么是动态网页和静态网页?
动态网页对应的是静态网页,也就是说网页网址的后缀并不是.等静态网页的常见形式。Perl、.cgi等形式都是后缀,还有一个标志性的符号——“?” 在动态网页 URL 中。如果有这样的动态网页,地址是:
这是一个典型的动态网页 URL 表单。
这里所说的动态网页与网页上的各种动画、滚动字幕等视觉“动态效果”没有直接关系。动态网页也可以是纯文本内容或收录各种动画。这些只是网页具体内容的呈现形式,无论网页是否具有动态效果,采用动态网站技术生成的网页都称为动态网页。
从网站查看者的角度来看,无论是动态网页还是静态网页,都可以展示基本的文字和图片信息,但从网站开发、管理、维护的角度来看,却是非常很难有大的区别。网络营销教学网站简单总结动态网页的一般特点如下:
(1)动态网页基于数据库技术,可以大大减少网站维护的工作量;
(2)网站使用动态web技术可以实现更多功能,如用户注册、用户登录、在线调查、用户管理、订单管理等;
(3)动态网页实际上并不是服务器上独立存在的网页文件,服务器只有在用户请求时才返回完整的网页;
(4)动态网页中的“?”对于搜索引擎检索有一定的问题,一般搜索引擎不可能从一个网站数据库中访问所有网页,或者出于技术考虑,搜索蜘蛛不会抓取URL中“?”后面的内容,所以使用动态网页的网站在推广搜索引擎时需要做一定的技术处理,以满足搜索引擎的要求。
动态网页抓取(动态页面的网站搜索引擎抓取就慢了吗?懂技术的都知道)
网站优化 • 优采云 发表了文章 • 0 个评论 • 48 次浏览 • 2022-03-29 05:15
每个人都说静态页面对 SEO 更友好?网站 搜索引擎对动态页面的抓取速度是否缓慢?
其实不,懂技术的人都知道。搜索引擎通过爬虫来爬取互联网上的页面。对于一个网站,有可能在搜索引擎到达你的站点后,搜索引擎会继续在网站中爬取,那么搜索引擎当然会继续爬取上的静态html文件服务器。但不要忘记搜索引擎的工作原理,它依赖互联网上的地址进行不断的爬取。也就是说,即使你使用动态页面,它仍然会根据你在网站上的情况进行爬取。例如,你有几个新闻更新,类似于 news.php?tid=1,2,3 等等。然后爬虫会根据这些链接对页面进行爬取,所以动态页面搜索引擎也会继续对页面进行爬取。
那么既然可以被搜索引擎抓取,为什么人们还提倡把所有的网站都设为静态。这实际上与搜索引擎优化有关。我们都知道,当页面是静态的时候,访问的时候直接获取页面结果。动态页面也需要向数据库发起请求,数据库开始根据条件返回相应的数据。这给了用户等待的时间。毕竟,从数据库中请求数据也需要资源。其次,搜索引擎对快速打开的页面具有排名靠前的算法。毕竟,让用户等待很长时间才能获得相同的页面并不是很友好。所以,这个静态页面还是更有利于搜索引擎的排名。
现在大家都知道了。如果您可以将 网站 设为静态,请尝试将 网站 设为静态。毕竟打开速度会更快,对排名也有好处。这是两全其美的。 查看全部
动态网页抓取(动态页面的网站搜索引擎抓取就慢了吗?懂技术的都知道)
每个人都说静态页面对 SEO 更友好?网站 搜索引擎对动态页面的抓取速度是否缓慢?

其实不,懂技术的人都知道。搜索引擎通过爬虫来爬取互联网上的页面。对于一个网站,有可能在搜索引擎到达你的站点后,搜索引擎会继续在网站中爬取,那么搜索引擎当然会继续爬取上的静态html文件服务器。但不要忘记搜索引擎的工作原理,它依赖互联网上的地址进行不断的爬取。也就是说,即使你使用动态页面,它仍然会根据你在网站上的情况进行爬取。例如,你有几个新闻更新,类似于 news.php?tid=1,2,3 等等。然后爬虫会根据这些链接对页面进行爬取,所以动态页面搜索引擎也会继续对页面进行爬取。
那么既然可以被搜索引擎抓取,为什么人们还提倡把所有的网站都设为静态。这实际上与搜索引擎优化有关。我们都知道,当页面是静态的时候,访问的时候直接获取页面结果。动态页面也需要向数据库发起请求,数据库开始根据条件返回相应的数据。这给了用户等待的时间。毕竟,从数据库中请求数据也需要资源。其次,搜索引擎对快速打开的页面具有排名靠前的算法。毕竟,让用户等待很长时间才能获得相同的页面并不是很友好。所以,这个静态页面还是更有利于搜索引擎的排名。
现在大家都知道了。如果您可以将 网站 设为静态,请尝试将 网站 设为静态。毕竟打开速度会更快,对排名也有好处。这是两全其美的。
动态网页抓取(2019独角兽企业重金招聘Python工程师标准(gt)(图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 64 次浏览 • 2022-03-29 03:27
2019独角兽企业招聘Python工程师标准>>>
1 简介
在 Python 网络爬虫内容提取器一文中,我们详细讲解了核心组件:可插拔内容提取器类 gsExtractor。本文记录了在确定gsExtractor技术路线过程中所做的编程实验。这是第二部分。第一部分实验用xslt方法提取静态网页内容,一次性转换成xml格式。一个问题仍然存在:如何提取由 javascript 管理的动态内容?那么这篇文章就回答了这个问题。
2. 动态内容提取技术组件
上一篇python使用xslt提取网页数据,要提取的内容是直接从网页的源码中获取的。但是有些Ajax动态内容在源代码中是找不到的,所以需要找到合适的程序库来加载异步或者动态加载的内容,交给本项目的抽取器进行抽取。
Python可以使用selenium来执行javascript,而selenium可以让浏览器自动加载页面并获取需要的数据。Selenium 没有自己的浏览器,可以使用第三方浏览器如 Firefox、Chrome 等,也可以使用 PhantomJS 等无头浏览器在后台执行。
三、源码及实验过程
假设我们要抓取京东手机页面的手机名称和价格(网页源码中找不到价格),如下图:
Step 1:利用吉搜科谋数个单元直观的标注功能,可以非常快速的自动生成调试好的抓取规则。其实就是一个标准的xslt程序,如下图,将生成的xslt程序复制到程序中的下面。注:本文仅记录实验过程。在实际系统中,将使用各种方法将 xslt 程序注入到内容提取器中。
第二步:执行如下代码(windows10下测试通过,python3.2),请注意:xslt是一个比较长的字符串,如果删除这个字符串,代码只有几行,足够看到 Python 的强大
#/usr/bin/python
from urllib import request
from lxml import etree
from selenium import webdriver
import time
# 京东手机商品页面
url = "http://item.jd.com/1312640.html"
# 下面的xslt是通过集搜客的谋数台图形界面自动生成的
xslt_root = etree.XML("""\
""")
# 使用webdriver.PhantomJS
browser = webdriver.PhantomJS(executable_path='C:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe')
browser.get(url)
time.sleep(3)
transform = etree.XSLT(xslt_root)
# 执行js得到整个dom
html = browser.execute_script("return document.documentElement.outerHTML")
doc = etree.HTML(html)
# 用xslt从dom中提取需要的字段
result_tree = transform(doc)
print(result_tree)
第三步:如下图所示,网页中的手机名称和价格被正确抓取
4. 继续阅读
至此,我们通过两篇文章文章演示了如何抓取静态和动态网页内容,均使用xslt一次性从网页中提取出需要的内容。事实上,xslt 是一种相对复杂的编程语言。如果你手动写xslt,那么最好写成离散的xpath。如果这个xslt不是手工写的,而是程序自动生成的,那是有道理的,程序员也不再需要花时间编写和调试抓取规则,这是一项非常耗时耗力的工作。下一篇《1分钟快速生成网页内容提取的xslt》将介绍如何生成xslt。
5. Jisouke GooSeeker开源代码下载源
1.GooSeeker开源Python网络爬虫GitHub源码
6.文档修改历史
2016-05-26:V2.0,添加文字说明
2016-05-29:V2.1,增加第5章:源码下载源码,并替换github源码的URL 查看全部
动态网页抓取(2019独角兽企业重金招聘Python工程师标准(gt)(图))
2019独角兽企业招聘Python工程师标准>>>


1 简介
在 Python 网络爬虫内容提取器一文中,我们详细讲解了核心组件:可插拔内容提取器类 gsExtractor。本文记录了在确定gsExtractor技术路线过程中所做的编程实验。这是第二部分。第一部分实验用xslt方法提取静态网页内容,一次性转换成xml格式。一个问题仍然存在:如何提取由 javascript 管理的动态内容?那么这篇文章就回答了这个问题。
2. 动态内容提取技术组件
上一篇python使用xslt提取网页数据,要提取的内容是直接从网页的源码中获取的。但是有些Ajax动态内容在源代码中是找不到的,所以需要找到合适的程序库来加载异步或者动态加载的内容,交给本项目的抽取器进行抽取。
Python可以使用selenium来执行javascript,而selenium可以让浏览器自动加载页面并获取需要的数据。Selenium 没有自己的浏览器,可以使用第三方浏览器如 Firefox、Chrome 等,也可以使用 PhantomJS 等无头浏览器在后台执行。
三、源码及实验过程
假设我们要抓取京东手机页面的手机名称和价格(网页源码中找不到价格),如下图:

Step 1:利用吉搜科谋数个单元直观的标注功能,可以非常快速的自动生成调试好的抓取规则。其实就是一个标准的xslt程序,如下图,将生成的xslt程序复制到程序中的下面。注:本文仅记录实验过程。在实际系统中,将使用各种方法将 xslt 程序注入到内容提取器中。

第二步:执行如下代码(windows10下测试通过,python3.2),请注意:xslt是一个比较长的字符串,如果删除这个字符串,代码只有几行,足够看到 Python 的强大
#/usr/bin/python
from urllib import request
from lxml import etree
from selenium import webdriver
import time
# 京东手机商品页面
url = "http://item.jd.com/1312640.html"
# 下面的xslt是通过集搜客的谋数台图形界面自动生成的
xslt_root = etree.XML("""\
""")
# 使用webdriver.PhantomJS
browser = webdriver.PhantomJS(executable_path='C:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe')
browser.get(url)
time.sleep(3)
transform = etree.XSLT(xslt_root)
# 执行js得到整个dom
html = browser.execute_script("return document.documentElement.outerHTML")
doc = etree.HTML(html)
# 用xslt从dom中提取需要的字段
result_tree = transform(doc)
print(result_tree)
第三步:如下图所示,网页中的手机名称和价格被正确抓取

4. 继续阅读
至此,我们通过两篇文章文章演示了如何抓取静态和动态网页内容,均使用xslt一次性从网页中提取出需要的内容。事实上,xslt 是一种相对复杂的编程语言。如果你手动写xslt,那么最好写成离散的xpath。如果这个xslt不是手工写的,而是程序自动生成的,那是有道理的,程序员也不再需要花时间编写和调试抓取规则,这是一项非常耗时耗力的工作。下一篇《1分钟快速生成网页内容提取的xslt》将介绍如何生成xslt。
5. Jisouke GooSeeker开源代码下载源
1.GooSeeker开源Python网络爬虫GitHub源码
6.文档修改历史
2016-05-26:V2.0,添加文字说明
2016-05-29:V2.1,增加第5章:源码下载源码,并替换github源码的URL
动态网页抓取(动态网页抓取有两种方式可以考虑:如何让服务器不受影响)
网站优化 • 优采云 发表了文章 • 0 个评论 • 51 次浏览 • 2022-03-24 18:01
动态网页抓取有两种方式可以考虑:1.原生动态网页抓取https即http协议原生返回给浏览器。抓取时,推荐使用抓包工具,比如:awk或者python内置库pyspider。2.restful动态网页抓取rest风格是一种对传统http协议(post请求)的模拟与封装。用户传递给服务器的参数是以字符串形式的数据传递,但是由于post方式无法传递链接参数,所以网站设计人员会采用其他http协议方式返回数据。
如图所示:这种方式在http协议基础上根据抓取的用户方式不同,用户端与服务器通过一定的协议链接数来传递数据,如用户可以自定义的结构化传递数据。这种实现的特点是:可以将数据安全传递给web服务器。这种实现非常容易实现,但是在参数的处理上稍微麻烦点,代码耦合性也高。
https简单说就是http协议的安全升级版。所以可以用网页抓包工具实现。
https提供ssl协议,能够防止数据被篡改。但是依然存在可以被窃取的隐患。比如知乎上就有过类似的漏洞,抓包工具能被抓取。如何让服务器不受影响的情况下,抓取数据的话,就是利用session可以来实现对服务器中的数据进行会话控制。但是session也是存在有一定的可能被嗅探,泄露数据的风险。此外,session会有个不定期的频率刷新,保证数据都不会被修改,这就意味着session无法防止注入。
但是,既然你说是静态的网页,通常是在iframe中放置返回text,也能够保证不会进行其他暴力破解。如果有想法,可以去爬一些小网站去研究下。如果想去看视频,可以到找个自动化爬虫工具,把站点访问计划给打好,然后自己跑流程...最后题主要注意安全,最安全的策略就是不要随便用非本地机器来爬,如果用后台服务器不方便做黑产,可以考虑sqlmap,写一个通用的sqlmap工具,对视频页面也可以的,主要是抓数据。 查看全部
动态网页抓取(动态网页抓取有两种方式可以考虑:如何让服务器不受影响)
动态网页抓取有两种方式可以考虑:1.原生动态网页抓取https即http协议原生返回给浏览器。抓取时,推荐使用抓包工具,比如:awk或者python内置库pyspider。2.restful动态网页抓取rest风格是一种对传统http协议(post请求)的模拟与封装。用户传递给服务器的参数是以字符串形式的数据传递,但是由于post方式无法传递链接参数,所以网站设计人员会采用其他http协议方式返回数据。
如图所示:这种方式在http协议基础上根据抓取的用户方式不同,用户端与服务器通过一定的协议链接数来传递数据,如用户可以自定义的结构化传递数据。这种实现的特点是:可以将数据安全传递给web服务器。这种实现非常容易实现,但是在参数的处理上稍微麻烦点,代码耦合性也高。
https简单说就是http协议的安全升级版。所以可以用网页抓包工具实现。
https提供ssl协议,能够防止数据被篡改。但是依然存在可以被窃取的隐患。比如知乎上就有过类似的漏洞,抓包工具能被抓取。如何让服务器不受影响的情况下,抓取数据的话,就是利用session可以来实现对服务器中的数据进行会话控制。但是session也是存在有一定的可能被嗅探,泄露数据的风险。此外,session会有个不定期的频率刷新,保证数据都不会被修改,这就意味着session无法防止注入。
但是,既然你说是静态的网页,通常是在iframe中放置返回text,也能够保证不会进行其他暴力破解。如果有想法,可以去爬一些小网站去研究下。如果想去看视频,可以到找个自动化爬虫工具,把站点访问计划给打好,然后自己跑流程...最后题主要注意安全,最安全的策略就是不要随便用非本地机器来爬,如果用后台服务器不方便做黑产,可以考虑sqlmap,写一个通用的sqlmap工具,对视频页面也可以的,主要是抓数据。
动态网页抓取(ajax横行的年代,我们的网页是残缺的吗? )
网站优化 • 优采云 发表了文章 • 0 个评论 • 86 次浏览 • 2022-03-24 01:20
)
在ajax时代,很多网页的内容都是动态加载的,我们的小爬虫只抓取web服务器返回给我们的html,其中包括
跳过js加载部分,表示爬虫抓取的网页不完整,不完整。您可以在下面看到博客园的主页
从首页的加载中可以看出,页面渲染完成后,会有5个异步ajax请求。默认情况下,爬虫无法抓取这些ajax生成的内容。
这时候,如果你想得到它,你必须调用浏览器的内核引擎来下载这些动态页面。目前内核引擎是三足的。
Trident:也就是IE内核,WebBrowser就是基于这个内核,但是加载性能比较差。
Gecko:FF的内核比Trident的性能更好。
WebKit:Safari和Chrome的核心,性能你懂的,在真实场景中还是主要的。
好的,为了简单方便,这里我们使用WebBrowser来玩,使用WebBrowser的时候要注意以下几点:
首先:因为WebBrowser是System.Windows.Forms中的winform控件,所以我们需要设置STAThread标签。
第二:winform是事件驱动的,Console不响应事件,所有事件都在windows的消息队列中等待执行,以防止程序假死,
我们需要调用DoEvents方法来传递控制权,让操作系统执行其他事件。
第三:WebBrowser内容,我们需要使用DomDocument来查看,而不是DocumentText。
判断动态网页是否加载一般有两种方式:
①:设置一个最大值,因为每当异步加载一个js时,都会触发一个Navigating和DocumentCompleted事件,所以我们这里需要这样做
记录计数值
.
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Windows.Forms;
6 using System.Threading;
7 using System.IO;
8
9 namespace ConsoleApplication2
10 {
11 public class Program
12 {
13 static int hitCount = 0;
14
15 [STAThread]
16 static void Main(string[] args)
17 {
18 string url = "http://www.cnblogs.com";
19
20 WebBrowser browser = new WebBrowser();
21
22 browser.ScriptErrorsSuppressed = true;
23
24 browser.Navigating += (sender, e) =>
25 {
26 hitCount++;
27 };
28
29 browser.DocumentCompleted += (sender, e) =>
30 {
31 hitCount++;
32 };
33
34 browser.Navigate(url);
35
36 while (browser.ReadyState != WebBrowserReadyState.Complete)
37 {
38 Application.DoEvents();
39 }
40
41 while (hitCount < 16)
42 Application.DoEvents();
43
44 var htmldocument = (mshtml.HTMLDocument)browser.Document.DomDocument;
45
46 string gethtml = htmldocument.documentElement.outerHTML;
47
48 //写入文件
49 using (StreamWriter sw = new StreamWriter(Environment.CurrentDirectory + "//1.html"))
50 {
51 sw.WriteLine(gethtml);
52 }
53
54 Console.WriteLine("html 文件 已经生成!");
55
56 Console.Read();
57 }
58 }
59 }
然后,我们打开生成的1.html,看看js加载的内容有没有。
②:当然,除了通过判断最大值来判断加载是否完成,我们还可以通过设置一个Timer来判断,比如3s、4s、5s,稍后再查看
WEB浏览器是否加载。
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Windows.Forms;
6 using System.Threading;
7 using System.IO;
8
9 namespace ConsoleApplication2
10 {
11 public class Program
12 {
13 [STAThread]
14 static void Main(string[] args)
15 {
16 string url = "http://www.cnblogs.com";
17
18 WebBrowser browser = new WebBrowser();
19
20 browser.ScriptErrorsSuppressed = true;
21
22 browser.Navigate(url);
23
24 //先要等待加载完毕
25 while (browser.ReadyState != WebBrowserReadyState.Complete)
26 {
27 Application.DoEvents();
28 }
29
30 System.Timers.Timer timer = new System.Timers.Timer();
31
32 var isComplete = false;
33
34 timer.Elapsed += new System.Timers.ElapsedEventHandler((sender, e) =>
35 {
36 //加载完毕
37 isComplete = true;
38
39 timer.Stop();
40 });
41
42 timer.Interval = 1000 * 5;
43
44 timer.Start();
45
46 //继续等待 5s,等待js加载完
47 while (!isComplete)
48 Application.DoEvents();
49
50 var htmldocument = (mshtml.HTMLDocument)browser.Document.DomDocument;
51
52 string gethtml = htmldocument.documentElement.outerHTML;
53
54 //写入文件
55 using (StreamWriter sw = new StreamWriter(Environment.CurrentDirectory + "//1.html"))
56 {
57 sw.WriteLine(gethtml);
58 }
59
60 Console.WriteLine("html 文件 已经生成!");
61
62 Console.Read();
63 }
64 }
65 }
当然,效果还是一样的,就不截图了。从以上两种写法来看,我们的WebBrowser放在主线程中。让我们看看如何把它放在工作线程上。
很简单,只需将工作线程设置为STA模式即可。
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Windows.Forms;
6 using System.Threading;
7
8 namespace ConsoleApplication2
9 {
10 public class Program
11 {
12 static int hitCount = 0;
13
14 //[STAThread]
15 static void Main(string[] args)
16 {
17 Thread thread = new Thread(new ThreadStart(() =>
18 {
19 Init();
20 System.Windows.Forms.Application.Run();
21 }));
22
23 //将该工作线程设定为STA模式
24 thread.SetApartmentState(ApartmentState.STA);
25
26 thread.Start();
27
28 Console.Read();
29 }
30
31 static void Init()
32 {
33 string url = "http://www.cnblogs.com";
34
35 WebBrowser browser = new WebBrowser();
36
37 browser.ScriptErrorsSuppressed = true;
38
39 browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browser_DocumentCompleted);
40
41 browser.Navigating += new WebBrowserNavigatingEventHandler(browser_Navigating);
42
43 browser.Navigate(url);
44
45 while (browser.ReadyState != WebBrowserReadyState.Complete)
46 {
47 Application.DoEvents();
48 }
49
50 while (hitCount < 16)
51 Application.DoEvents();
52
53 var htmldocument = (mshtml.HTMLDocument)browser.Document.DomDocument;
54
55 string gethtml = htmldocument.documentElement.outerHTML;
56
57 Console.WriteLine(gethtml);
58 }
59
60 static void browser_Navigating(object sender, WebBrowserNavigatingEventArgs e)
61 {
62 hitCount++;
63 }
64
65 static void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
66 {
67 hitCount++;
68 }
69 }
70 }
查看全部
动态网页抓取(ajax横行的年代,我们的网页是残缺的吗?
)
在ajax时代,很多网页的内容都是动态加载的,我们的小爬虫只抓取web服务器返回给我们的html,其中包括
跳过js加载部分,表示爬虫抓取的网页不完整,不完整。您可以在下面看到博客园的主页

从首页的加载中可以看出,页面渲染完成后,会有5个异步ajax请求。默认情况下,爬虫无法抓取这些ajax生成的内容。
这时候,如果你想得到它,你必须调用浏览器的内核引擎来下载这些动态页面。目前内核引擎是三足的。
Trident:也就是IE内核,WebBrowser就是基于这个内核,但是加载性能比较差。
Gecko:FF的内核比Trident的性能更好。
WebKit:Safari和Chrome的核心,性能你懂的,在真实场景中还是主要的。
好的,为了简单方便,这里我们使用WebBrowser来玩,使用WebBrowser的时候要注意以下几点:
首先:因为WebBrowser是System.Windows.Forms中的winform控件,所以我们需要设置STAThread标签。
第二:winform是事件驱动的,Console不响应事件,所有事件都在windows的消息队列中等待执行,以防止程序假死,
我们需要调用DoEvents方法来传递控制权,让操作系统执行其他事件。
第三:WebBrowser内容,我们需要使用DomDocument来查看,而不是DocumentText。
判断动态网页是否加载一般有两种方式:
①:设置一个最大值,因为每当异步加载一个js时,都会触发一个Navigating和DocumentCompleted事件,所以我们这里需要这样做
记录计数值
.

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Windows.Forms;
6 using System.Threading;
7 using System.IO;
8
9 namespace ConsoleApplication2
10 {
11 public class Program
12 {
13 static int hitCount = 0;
14
15 [STAThread]
16 static void Main(string[] args)
17 {
18 string url = "http://www.cnblogs.com";
19
20 WebBrowser browser = new WebBrowser();
21
22 browser.ScriptErrorsSuppressed = true;
23
24 browser.Navigating += (sender, e) =>
25 {
26 hitCount++;
27 };
28
29 browser.DocumentCompleted += (sender, e) =>
30 {
31 hitCount++;
32 };
33
34 browser.Navigate(url);
35
36 while (browser.ReadyState != WebBrowserReadyState.Complete)
37 {
38 Application.DoEvents();
39 }
40
41 while (hitCount < 16)
42 Application.DoEvents();
43
44 var htmldocument = (mshtml.HTMLDocument)browser.Document.DomDocument;
45
46 string gethtml = htmldocument.documentElement.outerHTML;
47
48 //写入文件
49 using (StreamWriter sw = new StreamWriter(Environment.CurrentDirectory + "//1.html"))
50 {
51 sw.WriteLine(gethtml);
52 }
53
54 Console.WriteLine("html 文件 已经生成!");
55
56 Console.Read();
57 }
58 }
59 }

然后,我们打开生成的1.html,看看js加载的内容有没有。

②:当然,除了通过判断最大值来判断加载是否完成,我们还可以通过设置一个Timer来判断,比如3s、4s、5s,稍后再查看
WEB浏览器是否加载。

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Windows.Forms;
6 using System.Threading;
7 using System.IO;
8
9 namespace ConsoleApplication2
10 {
11 public class Program
12 {
13 [STAThread]
14 static void Main(string[] args)
15 {
16 string url = "http://www.cnblogs.com";
17
18 WebBrowser browser = new WebBrowser();
19
20 browser.ScriptErrorsSuppressed = true;
21
22 browser.Navigate(url);
23
24 //先要等待加载完毕
25 while (browser.ReadyState != WebBrowserReadyState.Complete)
26 {
27 Application.DoEvents();
28 }
29
30 System.Timers.Timer timer = new System.Timers.Timer();
31
32 var isComplete = false;
33
34 timer.Elapsed += new System.Timers.ElapsedEventHandler((sender, e) =>
35 {
36 //加载完毕
37 isComplete = true;
38
39 timer.Stop();
40 });
41
42 timer.Interval = 1000 * 5;
43
44 timer.Start();
45
46 //继续等待 5s,等待js加载完
47 while (!isComplete)
48 Application.DoEvents();
49
50 var htmldocument = (mshtml.HTMLDocument)browser.Document.DomDocument;
51
52 string gethtml = htmldocument.documentElement.outerHTML;
53
54 //写入文件
55 using (StreamWriter sw = new StreamWriter(Environment.CurrentDirectory + "//1.html"))
56 {
57 sw.WriteLine(gethtml);
58 }
59
60 Console.WriteLine("html 文件 已经生成!");
61
62 Console.Read();
63 }
64 }
65 }

当然,效果还是一样的,就不截图了。从以上两种写法来看,我们的WebBrowser放在主线程中。让我们看看如何把它放在工作线程上。
很简单,只需将工作线程设置为STA模式即可。

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Windows.Forms;
6 using System.Threading;
7
8 namespace ConsoleApplication2
9 {
10 public class Program
11 {
12 static int hitCount = 0;
13
14 //[STAThread]
15 static void Main(string[] args)
16 {
17 Thread thread = new Thread(new ThreadStart(() =>
18 {
19 Init();
20 System.Windows.Forms.Application.Run();
21 }));
22
23 //将该工作线程设定为STA模式
24 thread.SetApartmentState(ApartmentState.STA);
25
26 thread.Start();
27
28 Console.Read();
29 }
30
31 static void Init()
32 {
33 string url = "http://www.cnblogs.com";
34
35 WebBrowser browser = new WebBrowser();
36
37 browser.ScriptErrorsSuppressed = true;
38
39 browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browser_DocumentCompleted);
40
41 browser.Navigating += new WebBrowserNavigatingEventHandler(browser_Navigating);
42
43 browser.Navigate(url);
44
45 while (browser.ReadyState != WebBrowserReadyState.Complete)
46 {
47 Application.DoEvents();
48 }
49
50 while (hitCount < 16)
51 Application.DoEvents();
52
53 var htmldocument = (mshtml.HTMLDocument)browser.Document.DomDocument;
54
55 string gethtml = htmldocument.documentElement.outerHTML;
56
57 Console.WriteLine(gethtml);
58 }
59
60 static void browser_Navigating(object sender, WebBrowserNavigatingEventArgs e)
61 {
62 hitCount++;
63 }
64
65 static void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
66 {
67 hitCount++;
68 }
69 }
70 }

动态网页抓取(R语言结合自然语言处理研究报告的文本全部抓取出来(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2022-03-23 18:01
最近一直在研究R语言结合自然语言处理来分析公司研究报告相关的话题。不过由于单位的数据不能拿出来研究,只能周末在家看看怎么从网上抓取相关数据,效果还不错。各大券商的评级、推荐时间、股票代码、研究报告正文均可在线检索。具体图片如下,示例可在以下网址下载:
由于金融行业的研究报告总数不是很大,通过使用selenium控制浏览器行为来抓取相关数据,对于没有学过爬虫的人来说可以节省不少脑细胞,但是安装selenium有很多陷阱. 本文具体介绍如何安装selenium,使用R语言工具调用。
首先是安装JDK,从官网下载JDK。
单击“计算机-属性-高级系统设置”,单击“环境变量”。单击系统变量下的新建以创建新的系统环境变量。
(1)New->变量名“JAVA_HOME”,变量值“C:\Java\jdk1.8.0_05”(即JDK的安装路径)
(2)编辑->变量名“路径”,在原变量值末尾添加“;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin”
(3)New->变量名“CLASSPATH”,变量值“.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar”
安装完成后,cmd进入命令行,执行java -version可以看到正确的版本。
然后安装chrome,可以访问这个官网的网址,点击免费下载直接安装即可。
三是下载相关插件解压到chrome安装目录C:\Program Files(x86)\Google\Chrome\Application.
第四步
start-execute-cmd 进入命令行
cd C:\Program Files (x86)\Google\Chrome\Application (进入浏览器安装目录)
java -Dwebdriver.chrome.driver="chromedriver.exe" -jar selenium-server-standalone-3.9.1.jar (启动服务器) 查看全部
动态网页抓取(R语言结合自然语言处理研究报告的文本全部抓取出来(组图))
最近一直在研究R语言结合自然语言处理来分析公司研究报告相关的话题。不过由于单位的数据不能拿出来研究,只能周末在家看看怎么从网上抓取相关数据,效果还不错。各大券商的评级、推荐时间、股票代码、研究报告正文均可在线检索。具体图片如下,示例可在以下网址下载:

由于金融行业的研究报告总数不是很大,通过使用selenium控制浏览器行为来抓取相关数据,对于没有学过爬虫的人来说可以节省不少脑细胞,但是安装selenium有很多陷阱. 本文具体介绍如何安装selenium,使用R语言工具调用。
首先是安装JDK,从官网下载JDK。
单击“计算机-属性-高级系统设置”,单击“环境变量”。单击系统变量下的新建以创建新的系统环境变量。
(1)New->变量名“JAVA_HOME”,变量值“C:\Java\jdk1.8.0_05”(即JDK的安装路径)
(2)编辑->变量名“路径”,在原变量值末尾添加“;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin”
(3)New->变量名“CLASSPATH”,变量值“.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar”
安装完成后,cmd进入命令行,执行java -version可以看到正确的版本。
然后安装chrome,可以访问这个官网的网址,点击免费下载直接安装即可。
三是下载相关插件解压到chrome安装目录C:\Program Files(x86)\Google\Chrome\Application.
第四步
start-execute-cmd 进入命令行
cd C:\Program Files (x86)\Google\Chrome\Application (进入浏览器安装目录)
java -Dwebdriver.chrome.driver="chromedriver.exe" -jar selenium-server-standalone-3.9.1.jar (启动服务器)
动态网页抓取(生成htmlchrome浏览器下,怎么利用js或jquery获取本地ip地址)
网站优化 • 优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2022-03-22 21:21
Chrome扩展如何获取JS动态生成的网页元素?
应该不可能将事件绑定到控件不是动态生成的元素。
但是您可以将事件绑定到顶级文档以确定单击了哪个元素。
生成html
chrome浏览器下如何使用js或者jquery获取本地ip地址,不要依赖第三方应用
具体解决方案如下:
1、原因是chrome不支持js在本地操作cookies!
经测试,除chrome浏览器外,其他主流浏览器(即firefox等)均支持js在本地操作cookies。当然,所有部署到服务器的浏览器都支持。
2、当然,还有一个原因:浏览器设置为不支持cookies。这样,调试js来操作cookies当然是无效的。
你以为你乱写,我就给你加分吗?. .
为什么在 Chrome 插件中引用 jQuery 无效
你可以用f12打开控制台看看有没有报错,看看你有没有导入jQuery.js文件,用你自己的版本号查看你的浏览器版本支持的JQuery版本号。首先,请检查浏览器是否禁用了javascript脚本。
第二页打开后,f12查看是否有错误。即使是一点点错误也会终止所有相关代码
第三个也是打开页面后f12。在elements标签的代码中,找到你引用jquery的地方。您的 jquery 文件将显示一个超链接。点击查看能否以查看代码的形式打开。如果不是 可以说明引用的文件或者引用的路径有误
最后请检查代码中jquery文件的加载是否在所有调用jquery的函数之前
如何使用jquery判断谷歌浏览器
判断$.browser.WebKit等于True就够了
苹果的 Safari 和谷歌的 Chrome 浏览器都是基于 WebKit 框架 jquery1.8 开发的
如果($.browser.chrome)
{
alert("chrome 浏览器!");
一句话 var ischrome = navigator.useragent.tolowercase().match(/chrome/) != null; if (ischrome) { alert('chrome'); } 查看全部
动态网页抓取(生成htmlchrome浏览器下,怎么利用js或jquery获取本地ip地址)
Chrome扩展如何获取JS动态生成的网页元素?
应该不可能将事件绑定到控件不是动态生成的元素。
但是您可以将事件绑定到顶级文档以确定单击了哪个元素。
生成html
chrome浏览器下如何使用js或者jquery获取本地ip地址,不要依赖第三方应用
具体解决方案如下:
1、原因是chrome不支持js在本地操作cookies!
经测试,除chrome浏览器外,其他主流浏览器(即firefox等)均支持js在本地操作cookies。当然,所有部署到服务器的浏览器都支持。
2、当然,还有一个原因:浏览器设置为不支持cookies。这样,调试js来操作cookies当然是无效的。
你以为你乱写,我就给你加分吗?. .
为什么在 Chrome 插件中引用 jQuery 无效
你可以用f12打开控制台看看有没有报错,看看你有没有导入jQuery.js文件,用你自己的版本号查看你的浏览器版本支持的JQuery版本号。首先,请检查浏览器是否禁用了javascript脚本。
第二页打开后,f12查看是否有错误。即使是一点点错误也会终止所有相关代码
第三个也是打开页面后f12。在elements标签的代码中,找到你引用jquery的地方。您的 jquery 文件将显示一个超链接。点击查看能否以查看代码的形式打开。如果不是 可以说明引用的文件或者引用的路径有误
最后请检查代码中jquery文件的加载是否在所有调用jquery的函数之前
如何使用jquery判断谷歌浏览器
判断$.browser.WebKit等于True就够了
苹果的 Safari 和谷歌的 Chrome 浏览器都是基于 WebKit 框架 jquery1.8 开发的
如果($.browser.chrome)
{
alert("chrome 浏览器!");
一句话 var ischrome = navigator.useragent.tolowercase().match(/chrome/) != null; if (ischrome) { alert('chrome'); }