python抓取动态网页

python抓取动态网页

python抓取动态网页(常见的反爬机制及处理方式(一)|)

网站优化优采云 发表了文章 • 0 个评论 • 63 次浏览 • 2021-09-13 11:13 • 来自相关话题

  python抓取动态网页(常见的反爬机制及处理方式(一)|)
  常见的防爬机制及处理方法
  1、Headers Anti-Crawler:Cookie、Referer、User-Agent
  解决方法:通过 F12 获取 headers 并将它们传递给 requests.get() 方法
  2、IP 限制:网站according
  常见的防爬机制及处理方法
  1、Headers Anti-Crawler:Cookie、Referer、User-Agent
  解决方法:通过 F12 获取 headers 并将它们传递给 requests.get() 方法
  2、IP限制:网站根据IP地址访问频率进行反爬,短时间IP访问
  解决方案:
  1、构建自己的IP代理池,每次访问随机选择代理,并经常更新代理池
  2、购买开放代理或私有代理IP
  3、降低爬取速度
  3、User-Agent 限制:类似于IP限制
  解决方案:构建自己的User-Agent池,每次访问随机选择
  5、查询参数或表单数据的认证(salt、sign)
  解决方法:找到JS文件,分析JS处理方式,用Python同样处理
  6、处理响应内容
  解决方法:打印查看响应内容,使用xpath或者常规处理
  python 中对 headers 和 formdata 的常规处理
  1、pycharm 访问方式:Ctrl + r,选择Regex
  2、Process 标头和表单数据
  (.*): (.*)
  "1":"1":"2",
  3、点击全部替换
  民政部网站数据采集
  目标:抓取中华人民共和国最新的县级以上行政区划代码
  网址:-民政数据-行政部门代码
  实施步骤
  1、民政数据中提取最新行政区划代码链接网站
  最新在上,命名格式:X,2019,中华人民共和国县级以上行政区划代码
  
import requests
from lxml import etree
import re

url = 'http://www.mca.gov.cn/article/sj/xzqh/2019/'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'}
html = requests.get(url, headers=headers).text
parse_html = etree.HTML(html)
article_list = parse_html.xpath('//a[@class="artitlelist"]')

for article in article_list:
title = article.xpath('./@title')[0]
# 正则匹配title中包含这个字符串的链接
if title.endswith('代码'):
# 获取到第1个就停止即可,第1个永远是最新的链接
two_link = 'http://www.mca.gov.cn' + article.xpath('./@href')[0]
print(two_link)
break
  2、从二级页面链接中提取真实链接(反爬-响应网页内容中嵌入的JS,指向新的网页链接)
  向二级页面链接发送请求获取响应内容,查看嵌入的JS代码
  定期提取真实二级页面链接
  
# 爬取二级“假”链接
two_html = requests.get(two_link, headers=headers).text
# 从二级页面的响应中提取真实的链接(此处为JS动态加载跳转的地址)
new_two_link = re.findall(r'window.location.href="(.*?)" rel="external nofollow" rel="external nofollow" ', two_html, re.S)[0]
  3、在数据库表中查询此链接是否被爬取过,构建增量爬虫
  在数据库中创建一个版本表来存储爬取的链接
  检查程序每次执行时和版本表中的记录,看是否被爬取过
  
cursor.execute('select * from version')
result = self.cursor.fetchall()
if result:
if result[-1][0] == two_link:
print('已是最新')
else:
# 有更新,开始抓取
# 将链接再重新插入version表记录
  4、代码实现
  
import requests
from lxml import etree
import re
import pymysql
class GovementSpider(object):
def __init__(self):
self.url = 'http://www.mca.gov.cn/article/sj/xzqh/2019/'
self.headers = {'User-Agent': 'Mozilla/5.0'}
# 创建2个对象
self.db = pymysql.connect('127.0.0.1', 'root', '123456', 'govdb', charset='utf8')
self.cursor = self.db.cursor()
# 获取假链接
def get_false_link(self):
html = requests.get(url=self.url, headers=self.headers).text
# 此处隐藏了真实的二级页面的url链接,真实的在假的响应网页中,通过js脚本生成,
# 假的链接在网页中可以访问,但是爬取到的内容却不是我们想要的
parse_html = etree.HTML(html)
a_list = parse_html.xpath('//a[@class="artitlelist"]')
for a in a_list:
# get()方法:获取某个属性的值
title = a.get('title')
if title.endswith('代码'):
# 获取到第1个就停止即可,第1个永远是最新的链接
false_link = 'http://www.mca.gov.cn' + a.get('href')
print("二级“假”链接的网址为", false_link)
break
# 提取真链接
self.incr_spider(false_link)
# 增量爬取函数
def incr_spider(self, false_link):
self.cursor.execute('select url from version where url=%s', [false_link])
# fetchall: (('http://xxxx.html',),)
result = self.cursor.fetchall()
# not result:代表数据库version表中无数据
if not result:
self.get_true_link(false_link)
# 可选操作: 数据库version表中只保留最新1条数据
self.cursor.execute("delete from version")
# 把爬取后的url插入到version表中
self.cursor.execute('insert into version values(%s)', [false_link])
self.db.commit()
else:
print('数据已是最新,无须爬取')
# 获取真链接
def get_true_link(self, false_link):
# 先获取假链接的响应,然后根据响应获取真链接
html = requests.get(url=false_link, headers=self.headers).text
# 从二级页面的响应中提取真实的链接(此处为JS动态加载跳转的地址)
re_bds = r'window.location.href="(.*?)" rel="external nofollow" rel="external nofollow" '
pattern = re.compile(re_bds, re.S)
true_link = pattern.findall(html)[0]
self.save_data(true_link) # 提取真链接的数据
# 用xpath直接提取数据
def save_data(self, true_link):
html = requests.get(url=true_link, headers=self.headers).text
# 基准xpath,提取每个信息的节点列表对象
parse_html = etree.HTML(html)
tr_list = parse_html.xpath('//tr[@height="19"]')
for tr in tr_list:
code = tr.xpath('./td[2]/text()')[0].strip() # 行政区划代码
name = tr.xpath('./td[3]/text()')[0].strip() # 单位名称
print(name, code)
# 主函数
def main(self):
self.get_false_link()
if __name__ == '__main__':
spider = GovementSpider()
spider.main()
  动态加载数据捕获-Ajax
  特点
  右键->查看网页源代码,无需具体数据
  滚动鼠标滚轮或其他动作时加载
  楣
  F12打开控制台,选择XHR异步加载数据包,找到抓取网络数据包的页面动作
  通过XHR获取json文件的URL地址-->Header-->General-->Request URL
  通过XHR-->Header-->查询字符串参数
  豆瓣电影数据采集案例
  目标
  地址:豆瓣电影-排行榜-剧情
  type_name=%E5%89%A7%E6%83%85&type=11&interval_id=100:90&action=
  目标:抓取电影名称、电影评分
  F12 数据包捕获 (XHR)
  1、Request URL(基本 URL 地址):
  2、Query String Paramaters(查询参数)
  
# 查询参数如下:
type: 13 # 电影类型
interval_id: 100:90
action: '[{},{},{}]'
start: 0 # 每次加载电影的起始索引值
limit: 20 # 每次加载的电影数量
  json 文件位于以下地址:
  基本 URL 地址 + 查询参数
  ''+'type=11&interval_id=100%3A90&action=&start=20&limit=20'
  代码实现
  
import requests
import time
from fake_useragent import UserAgent
class DoubanSpider(object):
def __init__(self):
self.base_url = 'https://movie.douban.com/j/chart/top_list?'
self.i = 0
def get_html(self, params):
headers = {'User-Agent': UserAgent().random}
res = requests.get(url=self.base_url, params=params, headers=headers)
res.encoding = 'utf-8'
html = res.json() # 将json格式的字符串转为python数据类型
self.parse_html(html) # 直接调用解析函数
def parse_html(self, html):
# html: [{电影1信息},{电影2信息},{}]
item = {}
for one in html:
item['name'] = one['title'] # 电影名
item['score'] = one['score'] # 评分
item['time'] = one['release_date'] # 打印测试
# 打印显示
print(item)
self.i += 1
# 获取电影总数
def get_total(self, typ):
# 异步动态加载的数据 都可以在XHR数据抓包
url = 'https://movie.douban.com/j/chart/top_list_count?type={}&interval_id=100%3A90'.format(typ)
ua = UserAgent()
html = requests.get(url=url, headers={'User-Agent': ua.random}).json()
total = html['total']
return total
def main(self):
typ = input('请输入电影类型(剧情|喜剧|动作):')
typ_dict = {'剧情': '11', '喜剧': '24', '动作': '5'}
typ = typ_dict[typ]
total = self.get_total(typ) # 获取该类型电影总数量
for page in range(0, int(total), 20):
params = {
'type': typ,
'interval_id': '100:90',
'action': '',
'start': str(page),
'limit': '20'}
self.get_html(params)
time.sleep(1)
print('爬取的电影的数量:', self.i)
if __name__ == '__main__':
spider = DoubanSpider()
spider.main()
  腾讯招聘数据抓取(Ajax)
  确定 URL 地址和目标
  网址:百度搜索腾讯招聘-查看职位
  目标:职位、工作职责、工作要求
  需求与分析
  查看网页源代码,我们知道所有需要的数据都是Ajax动态加载的
  通过F12获取网络数据包进行分析
  一级页面爬取数据:职位
  在二级页面抓取数据:工作职责、工作要求
  一级页面json地址(pageIndex在变化,时间戳不检查)
  {}&pageSize=10&language=zh-cn&area=cn
  二级页面地址(postId正在变化,可以在主页面获取)
  {}&language=zh-cn
  useragents.py 文件
  
ua_list = [
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)',
]
  
import time
import json
import random
import requests
from useragents import ua_list
class TencentSpider(object):
def __init__(self):
self.one_url = 'https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1563912271089&countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=&pageIndex={}&pageSize=10&language=zh-cn&area=cn'
self.two_url = 'https://careers.tencent.com/tencentcareer/api/post/ByPostId?timestamp=1563912374645&postId={}&language=zh-cn'
self.f = open('tencent.json', 'a') # 打开文件
self.item_list = [] # 存放抓取的item字典数据
# 获取响应内容函数
def get_page(self, url):
headers = {'User-Agent': random.choice(ua_list)}
html = requests.get(url=url, headers=headers).text
html = json.loads(html) # json格式字符串转为Python数据类型
return html
# 主线函数: 获取所有数据
def parse_page(self, one_url):
html = self.get_page(one_url)
item = {}
for job in html['Data']['Posts']:
item['name'] = job['RecruitPostName'] # 名称
post_id = job['PostId'] # postId,拿postid为了拼接二级页面地址
# 拼接二级地址,获取职责和要求
two_url = self.two_url.format(post_id)
item['duty'], item['require'] = self.parse_two_page(two_url)
print(item)
self.item_list.append(item) # 添加到大列表中
# 解析二级页面函数
def parse_two_page(self, two_url):
html = self.get_page(two_url)
duty = html['Data']['Responsibility'] # 工作责任
duty = duty.replace('\r\n', '').replace('\n', '') # 去掉换行
require = html['Data']['Requirement'] # 工作要求
require = require.replace('\r\n', '').replace('\n', '') # 去掉换行
return duty, require
# 获取总页数
def get_numbers(self):
url = self.one_url.format(1)
html = self.get_page(url)
numbers = int(html['Data']['Count']) // 10 + 1 # 每页有10个推荐
return numbers
def main(self):
number = self.get_numbers()
for page in range(1, 3):
one_url = self.one_url.format(page)
self.parse_page(one_url)
# 保存到本地json文件:json.dump
json.dump(self.item_list, self.f, ensure_ascii=False)
self.f.close()
if __name__ == '__main__':
start = time.time()
spider = TencentSpider()
spider.main()
end = time.time()
print('执行时间:%.2f' % (end - start))
  以上是本文的全部内容。希望对大家的学习有所帮助,也希望大家多多支持Scripthome。 查看全部

  python抓取动态网页(常见的反爬机制及处理方式(一)|)
  常见的防爬机制及处理方法
  1、Headers Anti-Crawler:Cookie、Referer、User-Agent
  解决方法:通过 F12 获取 headers 并将它们传递给 requests.get() 方法
  2、IP 限制:网站according
  常见的防爬机制及处理方法
  1、Headers Anti-Crawler:Cookie、Referer、User-Agent
  解决方法:通过 F12 获取 headers 并将它们传递给 requests.get() 方法
  2、IP限制:网站根据IP地址访问频率进行反爬,短时间IP访问
  解决方案:
  1、构建自己的IP代理池,每次访问随机选择代理,并经常更新代理池
  2、购买开放代理或私有代理IP
  3、降低爬取速度
  3、User-Agent 限制:类似于IP限制
  解决方案:构建自己的User-Agent池,每次访问随机选择
  5、查询参数或表单数据的认证(salt、sign)
  解决方法:找到JS文件,分析JS处理方式,用Python同样处理
  6、处理响应内容
  解决方法:打印查看响应内容,使用xpath或者常规处理
  python 中对 headers 和 formdata 的常规处理
  1、pycharm 访问方式:Ctrl + r,选择Regex
  2、Process 标头和表单数据
  (.*): (.*)
  "1":"1":"2",
  3、点击全部替换
  民政部网站数据采集
  目标:抓取中华人民共和国最新的县级以上行政区划代码
  网址:-民政数据-行政部门代码
  实施步骤
  1、民政数据中提取最新行政区划代码链接网站
  最新在上,命名格式:X,2019,中华人民共和国县级以上行政区划代码
  
import requests
from lxml import etree
import re

url = 'http://www.mca.gov.cn/article/sj/xzqh/2019/'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'}
html = requests.get(url, headers=headers).text
parse_html = etree.HTML(html)
article_list = parse_html.xpath('//a[@class="artitlelist"]')

for article in article_list:
title = article.xpath('./@title')[0]
# 正则匹配title中包含这个字符串的链接
if title.endswith('代码'):
# 获取到第1个就停止即可,第1个永远是最新的链接
two_link = 'http://www.mca.gov.cn' + article.xpath('./@href')[0]
print(two_link)
break
  2、从二级页面链接中提取真实链接(反爬-响应网页内容中嵌入的JS,指向新的网页链接)
  向二级页面链接发送请求获取响应内容,查看嵌入的JS代码
  定期提取真实二级页面链接
  
# 爬取二级“假”链接
two_html = requests.get(two_link, headers=headers).text
# 从二级页面的响应中提取真实的链接(此处为JS动态加载跳转的地址)
new_two_link = re.findall(r'window.location.href="(.*?)" rel="external nofollow" rel="external nofollow" ', two_html, re.S)[0]
  3、在数据库表中查询此链接是否被爬取过,构建增量爬虫
  在数据库中创建一个版本表来存储爬取的链接
  检查程序每次执行时和版本表中的记录,看是否被爬取过
  
cursor.execute('select * from version')
result = self.cursor.fetchall()
if result:
if result[-1][0] == two_link:
print('已是最新')
else:
# 有更新,开始抓取
# 将链接再重新插入version表记录
  4、代码实现
  
import requests
from lxml import etree
import re
import pymysql
class GovementSpider(object):
def __init__(self):
self.url = 'http://www.mca.gov.cn/article/sj/xzqh/2019/'
self.headers = {'User-Agent': 'Mozilla/5.0'}
# 创建2个对象
self.db = pymysql.connect('127.0.0.1', 'root', '123456', 'govdb', charset='utf8')
self.cursor = self.db.cursor()
# 获取假链接
def get_false_link(self):
html = requests.get(url=self.url, headers=self.headers).text
# 此处隐藏了真实的二级页面的url链接,真实的在假的响应网页中,通过js脚本生成,
# 假的链接在网页中可以访问,但是爬取到的内容却不是我们想要的
parse_html = etree.HTML(html)
a_list = parse_html.xpath('//a[@class="artitlelist"]')
for a in a_list:
# get()方法:获取某个属性的值
title = a.get('title')
if title.endswith('代码'):
# 获取到第1个就停止即可,第1个永远是最新的链接
false_link = 'http://www.mca.gov.cn' + a.get('href')
print("二级“假”链接的网址为", false_link)
break
# 提取真链接
self.incr_spider(false_link)
# 增量爬取函数
def incr_spider(self, false_link):
self.cursor.execute('select url from version where url=%s', [false_link])
# fetchall: (('http://xxxx.html',),)
result = self.cursor.fetchall()
# not result:代表数据库version表中无数据
if not result:
self.get_true_link(false_link)
# 可选操作: 数据库version表中只保留最新1条数据
self.cursor.execute("delete from version")
# 把爬取后的url插入到version表中
self.cursor.execute('insert into version values(%s)', [false_link])
self.db.commit()
else:
print('数据已是最新,无须爬取')
# 获取真链接
def get_true_link(self, false_link):
# 先获取假链接的响应,然后根据响应获取真链接
html = requests.get(url=false_link, headers=self.headers).text
# 从二级页面的响应中提取真实的链接(此处为JS动态加载跳转的地址)
re_bds = r'window.location.href="(.*?)" rel="external nofollow" rel="external nofollow" '
pattern = re.compile(re_bds, re.S)
true_link = pattern.findall(html)[0]
self.save_data(true_link) # 提取真链接的数据
# 用xpath直接提取数据
def save_data(self, true_link):
html = requests.get(url=true_link, headers=self.headers).text
# 基准xpath,提取每个信息的节点列表对象
parse_html = etree.HTML(html)
tr_list = parse_html.xpath('//tr[@height="19"]')
for tr in tr_list:
code = tr.xpath('./td[2]/text()')[0].strip() # 行政区划代码
name = tr.xpath('./td[3]/text()')[0].strip() # 单位名称
print(name, code)
# 主函数
def main(self):
self.get_false_link()
if __name__ == '__main__':
spider = GovementSpider()
spider.main()
  动态加载数据捕获-Ajax
  特点
  右键->查看网页源代码,无需具体数据
  滚动鼠标滚轮或其他动作时加载
  楣
  F12打开控制台,选择XHR异步加载数据包,找到抓取网络数据包的页面动作
  通过XHR获取json文件的URL地址-->Header-->General-->Request URL
  通过XHR-->Header-->查询字符串参数
  豆瓣电影数据采集案例
  目标
  地址:豆瓣电影-排行榜-剧情
  type_name=%E5%89%A7%E6%83%85&type=11&interval_id=100:90&action=
  目标:抓取电影名称、电影评分
  F12 数据包捕获 (XHR)
  1、Request URL(基本 URL 地址):
  2、Query String Paramaters(查询参数)
  
# 查询参数如下:
type: 13 # 电影类型
interval_id: 100:90
action: '[{},{},{}]'
start: 0 # 每次加载电影的起始索引值
limit: 20 # 每次加载的电影数量
  json 文件位于以下地址:
  基本 URL 地址 + 查询参数
  ''+'type=11&interval_id=100%3A90&action=&start=20&limit=20'
  代码实现
  
import requests
import time
from fake_useragent import UserAgent
class DoubanSpider(object):
def __init__(self):
self.base_url = 'https://movie.douban.com/j/chart/top_list?'
self.i = 0
def get_html(self, params):
headers = {'User-Agent': UserAgent().random}
res = requests.get(url=self.base_url, params=params, headers=headers)
res.encoding = 'utf-8'
html = res.json() # 将json格式的字符串转为python数据类型
self.parse_html(html) # 直接调用解析函数
def parse_html(self, html):
# html: [{电影1信息},{电影2信息},{}]
item = {}
for one in html:
item['name'] = one['title'] # 电影名
item['score'] = one['score'] # 评分
item['time'] = one['release_date'] # 打印测试
# 打印显示
print(item)
self.i += 1
# 获取电影总数
def get_total(self, typ):
# 异步动态加载的数据 都可以在XHR数据抓包
url = 'https://movie.douban.com/j/chart/top_list_count?type={}&interval_id=100%3A90'.format(typ)
ua = UserAgent()
html = requests.get(url=url, headers={'User-Agent': ua.random}).json()
total = html['total']
return total
def main(self):
typ = input('请输入电影类型(剧情|喜剧|动作):')
typ_dict = {'剧情': '11', '喜剧': '24', '动作': '5'}
typ = typ_dict[typ]
total = self.get_total(typ) # 获取该类型电影总数量
for page in range(0, int(total), 20):
params = {
'type': typ,
'interval_id': '100:90',
'action': '',
'start': str(page),
'limit': '20'}
self.get_html(params)
time.sleep(1)
print('爬取的电影的数量:', self.i)
if __name__ == '__main__':
spider = DoubanSpider()
spider.main()
  腾讯招聘数据抓取(Ajax)
  确定 URL 地址和目标
  网址:百度搜索腾讯招聘-查看职位
  目标:职位、工作职责、工作要求
  需求与分析
  查看网页源代码,我们知道所有需要的数据都是Ajax动态加载的
  通过F12获取网络数据包进行分析
  一级页面爬取数据:职位
  在二级页面抓取数据:工作职责、工作要求
  一级页面json地址(pageIndex在变化,时间戳不检查)
  {}&pageSize=10&language=zh-cn&area=cn
  二级页面地址(postId正在变化,可以在主页面获取)
  {}&language=zh-cn
  useragents.py 文件
  
ua_list = [
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)',
]
  
import time
import json
import random
import requests
from useragents import ua_list
class TencentSpider(object):
def __init__(self):
self.one_url = 'https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1563912271089&countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=&pageIndex={}&pageSize=10&language=zh-cn&area=cn'
self.two_url = 'https://careers.tencent.com/tencentcareer/api/post/ByPostId?timestamp=1563912374645&postId={}&language=zh-cn'
self.f = open('tencent.json', 'a') # 打开文件
self.item_list = [] # 存放抓取的item字典数据
# 获取响应内容函数
def get_page(self, url):
headers = {'User-Agent': random.choice(ua_list)}
html = requests.get(url=url, headers=headers).text
html = json.loads(html) # json格式字符串转为Python数据类型
return html
# 主线函数: 获取所有数据
def parse_page(self, one_url):
html = self.get_page(one_url)
item = {}
for job in html['Data']['Posts']:
item['name'] = job['RecruitPostName'] # 名称
post_id = job['PostId'] # postId,拿postid为了拼接二级页面地址
# 拼接二级地址,获取职责和要求
two_url = self.two_url.format(post_id)
item['duty'], item['require'] = self.parse_two_page(two_url)
print(item)
self.item_list.append(item) # 添加到大列表中
# 解析二级页面函数
def parse_two_page(self, two_url):
html = self.get_page(two_url)
duty = html['Data']['Responsibility'] # 工作责任
duty = duty.replace('\r\n', '').replace('\n', '') # 去掉换行
require = html['Data']['Requirement'] # 工作要求
require = require.replace('\r\n', '').replace('\n', '') # 去掉换行
return duty, require
# 获取总页数
def get_numbers(self):
url = self.one_url.format(1)
html = self.get_page(url)
numbers = int(html['Data']['Count']) // 10 + 1 # 每页有10个推荐
return numbers
def main(self):
number = self.get_numbers()
for page in range(1, 3):
one_url = self.one_url.format(page)
self.parse_page(one_url)
# 保存到本地json文件:json.dump
json.dump(self.item_list, self.f, ensure_ascii=False)
self.f.close()
if __name__ == '__main__':
start = time.time()
spider = TencentSpider()
spider.main()
end = time.time()
print('执行时间:%.2f' % (end - start))
  以上是本文的全部内容。希望对大家的学习有所帮助,也希望大家多多支持Scripthome。

python抓取动态网页(Python爬虫小程序,爬取百度贴吧网页文件,新手练手的好案例)

网站优化优采云 发表了文章 • 0 个评论 • 73 次浏览 • 2021-09-12 17:01 • 来自相关话题

  python抓取动态网页(Python爬虫小程序,爬取百度贴吧网页文件,新手练手的好案例)
  内容
  本文文章帮助初学者理清网络爬虫的思路。 文章 的内容并不深奥。主要是通过案例帮助大家学习爬虫程序。学习了这些基础工具之后,你的爬虫之路才刚刚开始。 文章的内容来自我博客中关于python爬虫的章节。更多内容请参考我博客的网络爬虫专栏。特别提示:转载请注明出处。
  0、crawler 介绍
  在做任何事情之前,先弄清楚你为什么要这样做,以及如何去做。
  网络爬虫简介:网络爬虫的目的,企业获取数据的方式,可以作为爬虫的编程语言,以及爬虫爬取数据的步骤
  一、静态文件捕获(响应文件中存在的数据)
  大部分数据直接写在静态文件上。这里的静态文件通常是指在一定时间内不会发生变化且不需要与后台交互的网页。
  1. 首先确认响应文件中是否存在抓取到的数据
  2.分析页面结构,观察URL地址规律
  1)查看网页元素的布局,预览整体结构,并使用控制台进行分析
  2)检查浏览网页时元素结构是否发生变化(如翻页)
  3)检查页面重定向时URL地址是否发生变化(判断是否发生请求转发或重定向),如果有,去JS代码中查找变化原因
  3.开始编写数据捕获代码
  4. 开始编写我的第一个爬虫程序
  Python爬虫入门,最简单的爬虫代码,网站如何判断是人为操作还是爬虫程序操作,对url参数中的中文参数进行编码,一个基于百度搜索的爬虫程序
  完成上述案例后,可以再做一个案例来练手。 Python爬虫小程序,爬取百度贴吧网页文件,新手练习的好案例。
  5.多级页面爬取思路
  以上两种情况都是抓取一级页面。一级页面是指打开一个网页,只抓取网页上的内容,而二级页面是一级页面的基础,你点击一个内容,这个内容往往是一个链接,它带你到另一个页面,这是二级页面。在做爬虫的时候,我们一般都是先下载一级页面。这个页面没有我们要爬取的数据,但是收录了网站的链接,里面存放着我们要的数据。采集完所有的链接,我们就拥有了所有的二级页面,你也拥有了所有的数据。这时候就可以去二级页面爬取数据了。有二级页面和三级页面和四级页面,但原理是一样的。
  我们来看看如何抓取二级页面的内容。
  Python爬虫,4567电影网电影信息爬取,二次页面处理方案
  二、动态文件捕获(响应文件中不存在的数据)
  这部分的数据不是存储在响应内容中,而是存储在Ajax XML文件或JS文件中,并且随着你的操作动态变化。
  1.如果你发现你想要的内容已经不在响应文件中了,那很有可能是使用ajax动态生成的
  2.F12 进入控制台抓包,刷新页面或执行某些动作,查看XHR异步加载的数据包内容
  1)GET 请求:检查Request Headers请求头,检查请求头是怎么做的,是否需要伪装请求头。
  查看查询字符串参数,查看请求参数,这些参数大多收录在URL中
  2)Post 请求:检查Request Headers请求头,检查请求头是怎么做的,是否需要伪装请求头。
  查看FormData表单数据,看post请求发送时封装了哪些数据,这些数据哪些是动态的,哪些是静态的,以及如何生成动态进一步分析(主要通过JS代码分析)
  3. 观察Form的查询参数或数据模式。如果需要进一步抓取分析处理,应该分析JS文件
  4.使用 request.get().json() 获取json数据,使用列表或字典提取数据
  三、多线程数据抓取
  1.把要爬取的网址放入队列
  需要用到的模块有:from queue import Queue
  2.多线程从队列中取出地址并调用requests模块获取文件
  需要用到的模块有:from threading import Thread
  3.进行I/O读写时注意加锁
  需要用到的模块有:from threading import Lock
  4.调用队列URL地址的两种写法
  当队列值为空时,线程如果发出请求就会被阻塞,因此需要对队列做空操作或抛出异常。
  方法一:判断队列是否为空,避免线程阻塞
  虽然为真:
  如果不是 q.empty():
  url=q.get()
  其他:
  休息
  方法二:随时间抛出异常
  试试:
  url=q.get(block=True,timeout=5)
  ....
  例外为 e:
  休息
  5.多线程争夺公共文件时的操作
  多线程写文件时不加线程锁会导致一系列问题
  方法如下:
  从线程导入锁
  lock=Lock()
  lock.acquire() #加锁
  代码块
  local.relase() #release
  案例:
  Python多线程爬虫、腾讯作业网作业爬虫、Ajax异步数据爬取模板
  四、将爬虫数据存入数据库并存入缓存的思路
  此内容将在未来添加..
  五、Python 爬虫程序常用的解析模块
  Pythoy一般用来解析带有re、lxml+xpath、json的页面模块,下面是用法
  1.re
  re用正则表达式来得到你想要的东西,核心是正则表达式怎么写
  python正则表达式re模块介绍,贪婪匹配与非贪婪匹配,案例:猫眼电影TOP100信息抽取
  2.lxml+xpath
  lxml+xpath就是写xpath,然后用lxml解析xpath进行匹配,需要知道xpath的规则(教程):
  Python常用插件,lxml+Xpath实现爬虫,使用Xpath爬取链家二手房信息
  3.ajax/json
  JSON 一般是ajax动态数据。请求得到ajax响应内容后,会进行json化,然后进一步处理,比如存储在库中,存储在缓存中
  Python多线程爬虫、腾讯作业网作业爬取程序、Ajax异步数据爬取模板
  4.pyexecjs
  python爬虫程序的百度翻译,pyexecjs模块的使用(python中的js解析库)
  六、crawler 框架
  1.Selenium
  Selenium 不是严格意义上的框架。它不同于传统的爬虫。 Selenium 更像是一个模拟人类操作的机器人。简单的说,你打开一个网页,比如起点小说网站,里面有很多你想感兴趣的小说复制到本地。人为地做到这一点是不可能的。一部小说短则几百,长则数万。您可以一张一张地复制它。是否可以?这时候就可以写一个Selenium爬虫程序来模拟你的行为:打开网页,点击小说,打开第一章,复制第一章,关闭网页,打开第二章,复制第二章……直到最后一章。 Selenium就是在做这样的事情,而且这些操作都是可视化的(你可以看到它在做这个),这是和传统爬虫最大的区别。
  Selenium+ChromeDriver框架、Selenium介绍、百度搜索、猫眼电影、京东商城案例
  2.Scrapy 框架
  Scrapy 是目前最流行的 Python 框架。这个框架帮助我们做了很多前期工作,省去了重复写的麻烦。最重要的是为爬虫程序提供一个可行的框架,并且尽可能的去理解。耦合使团队编程成为可能。想做python爬虫,Scarpy一定要掌握。
  教程:
  Scrapy爬虫框架,入门案例(很详细),Scrapy多线程思路 查看全部

  python抓取动态网页(Python爬虫小程序,爬取百度贴吧网页文件,新手练手的好案例)
  内容
  本文文章帮助初学者理清网络爬虫的思路。 文章 的内容并不深奥。主要是通过案例帮助大家学习爬虫程序。学习了这些基础工具之后,你的爬虫之路才刚刚开始。 文章的内容来自我博客中关于python爬虫的章节。更多内容请参考我博客的网络爬虫专栏。特别提示:转载请注明出处。
  0、crawler 介绍
  在做任何事情之前,先弄清楚你为什么要这样做,以及如何去做。
  网络爬虫简介:网络爬虫的目的,企业获取数据的方式,可以作为爬虫的编程语言,以及爬虫爬取数据的步骤
  一、静态文件捕获(响应文件中存在的数据)
  大部分数据直接写在静态文件上。这里的静态文件通常是指在一定时间内不会发生变化且不需要与后台交互的网页。
  1. 首先确认响应文件中是否存在抓取到的数据
  2.分析页面结构,观察URL地址规律
  1)查看网页元素的布局,预览整体结构,并使用控制台进行分析
  2)检查浏览网页时元素结构是否发生变化(如翻页)
  3)检查页面重定向时URL地址是否发生变化(判断是否发生请求转发或重定向),如果有,去JS代码中查找变化原因
  3.开始编写数据捕获代码
  4. 开始编写我的第一个爬虫程序
  Python爬虫入门,最简单的爬虫代码,网站如何判断是人为操作还是爬虫程序操作,对url参数中的中文参数进行编码,一个基于百度搜索的爬虫程序
  完成上述案例后,可以再做一个案例来练手。 Python爬虫小程序,爬取百度贴吧网页文件,新手练习的好案例。
  5.多级页面爬取思路
  以上两种情况都是抓取一级页面。一级页面是指打开一个网页,只抓取网页上的内容,而二级页面是一级页面的基础,你点击一个内容,这个内容往往是一个链接,它带你到另一个页面,这是二级页面。在做爬虫的时候,我们一般都是先下载一级页面。这个页面没有我们要爬取的数据,但是收录了网站的链接,里面存放着我们要的数据。采集完所有的链接,我们就拥有了所有的二级页面,你也拥有了所有的数据。这时候就可以去二级页面爬取数据了。有二级页面和三级页面和四级页面,但原理是一样的。
  我们来看看如何抓取二级页面的内容。
  Python爬虫,4567电影网电影信息爬取,二次页面处理方案
  二、动态文件捕获(响应文件中不存在的数据)
  这部分的数据不是存储在响应内容中,而是存储在Ajax XML文件或JS文件中,并且随着你的操作动态变化。
  1.如果你发现你想要的内容已经不在响应文件中了,那很有可能是使用ajax动态生成的
  2.F12 进入控制台抓包,刷新页面或执行某些动作,查看XHR异步加载的数据包内容
  1)GET 请求:检查Request Headers请求头,检查请求头是怎么做的,是否需要伪装请求头。
  查看查询字符串参数,查看请求参数,这些参数大多收录在URL中
  2)Post 请求:检查Request Headers请求头,检查请求头是怎么做的,是否需要伪装请求头。
  查看FormData表单数据,看post请求发送时封装了哪些数据,这些数据哪些是动态的,哪些是静态的,以及如何生成动态进一步分析(主要通过JS代码分析)
  3. 观察Form的查询参数或数据模式。如果需要进一步抓取分析处理,应该分析JS文件
  4.使用 request.get().json() 获取json数据,使用列表或字典提取数据
  三、多线程数据抓取
  1.把要爬取的网址放入队列
  需要用到的模块有:from queue import Queue
  2.多线程从队列中取出地址并调用requests模块获取文件
  需要用到的模块有:from threading import Thread
  3.进行I/O读写时注意加锁
  需要用到的模块有:from threading import Lock
  4.调用队列URL地址的两种写法
  当队列值为空时,线程如果发出请求就会被阻塞,因此需要对队列做空操作或抛出异常。
  方法一:判断队列是否为空,避免线程阻塞
  虽然为真:
  如果不是 q.empty():
  url=q.get()
  其他:
  休息
  方法二:随时间抛出异常
  试试:
  url=q.get(block=True,timeout=5)
  ....
  例外为 e:
  休息
  5.多线程争夺公共文件时的操作
  多线程写文件时不加线程锁会导致一系列问题
  方法如下:
  从线程导入锁
  lock=Lock()
  lock.acquire() #加锁
  代码块
  local.relase() #release
  案例:
  Python多线程爬虫、腾讯作业网作业爬虫、Ajax异步数据爬取模板
  四、将爬虫数据存入数据库并存入缓存的思路
  此内容将在未来添加..
  五、Python 爬虫程序常用的解析模块
  Pythoy一般用来解析带有re、lxml+xpath、json的页面模块,下面是用法
  1.re
  re用正则表达式来得到你想要的东西,核心是正则表达式怎么写
  python正则表达式re模块介绍,贪婪匹配与非贪婪匹配,案例:猫眼电影TOP100信息抽取
  2.lxml+xpath
  lxml+xpath就是写xpath,然后用lxml解析xpath进行匹配,需要知道xpath的规则(教程):
  Python常用插件,lxml+Xpath实现爬虫,使用Xpath爬取链家二手房信息
  3.ajax/json
  JSON 一般是ajax动态数据。请求得到ajax响应内容后,会进行json化,然后进一步处理,比如存储在库中,存储在缓存中
  Python多线程爬虫、腾讯作业网作业爬取程序、Ajax异步数据爬取模板
  4.pyexecjs
  python爬虫程序的百度翻译,pyexecjs模块的使用(python中的js解析库)
  六、crawler 框架
  1.Selenium
  Selenium 不是严格意义上的框架。它不同于传统的爬虫。 Selenium 更像是一个模拟人类操作的机器人。简单的说,你打开一个网页,比如起点小说网站,里面有很多你想感兴趣的小说复制到本地。人为地做到这一点是不可能的。一部小说短则几百,长则数万。您可以一张一张地复制它。是否可以?这时候就可以写一个Selenium爬虫程序来模拟你的行为:打开网页,点击小说,打开第一章,复制第一章,关闭网页,打开第二章,复制第二章……直到最后一章。 Selenium就是在做这样的事情,而且这些操作都是可视化的(你可以看到它在做这个),这是和传统爬虫最大的区别。
  Selenium+ChromeDriver框架、Selenium介绍、百度搜索、猫眼电影、京东商城案例
  2.Scrapy 框架
  Scrapy 是目前最流行的 Python 框架。这个框架帮助我们做了很多前期工作,省去了重复写的麻烦。最重要的是为爬虫程序提供一个可行的框架,并且尽可能的去理解。耦合使团队编程成为可能。想做python爬虫,Scarpy一定要掌握。
  教程:
  Scrapy爬虫框架,入门案例(很详细),Scrapy多线程思路

python抓取动态网页(快速入门:网页更新中的不同和XML的方式优点)

网站优化优采云 发表了文章 • 0 个评论 • 75 次浏览 • 2021-09-12 16:17 • 来自相关话题

  python抓取动态网页(快速入门:网页更新中的不同和XML的方式优点)
  动态网页数据获取 什么是 AJAX:
  AJAX(Asynchronouse JavaScript And XML)异步 JavaScript 和 XML。通过在后台与服务器交换少量数据,Ajax 可以使网页异步更新。这意味着可以在不重新加载整个网页的情况下更新网页的某些部分。如果内容需要更新,传统网页(不使用 Ajax)必须重新加载整个网页。因为传统的数据传输格式是XML语法。所以它被称为 AJAX。其实现在数据交互基本都是用JSON。使用AJAX加载的数据,即使使用JS将数据渲染到浏览器中,右击->查看网页源码也看不到ajax加载的数据,只能看到使用这个加载的html代码网址。
  ajax数据的获取方式:直接分析ajax调用的接口。然后通过代码请求这个接口。使用Selenium+chromedriver模拟浏览器行为获取数据。该方法的优缺点
  分析界面
  可以直接请求数据。无需做一些解析工作。代码量小,性能高。
  分析接口比较复杂,尤其是一些被js混淆的接口,必须有一定的js基础。很容易被发现是爬虫。
  硒
  直接模拟浏览器的行为。浏览器可以请求的内容也可以使用 selenium 请求。爬虫更稳定。
  大量代码。低性能。
  Selenium+chromedriver 获取动态数据:
  Selenium 相当于一个机器人。可以在浏览器上模拟人类的一些行为,在浏览器上自动处理一些行为,比如点击、填充数据、删除cookies等。 chromedriver是一个驱动Chrome浏览器的驱动,可以用来驱动浏览器当然,不同的浏览器有不同的驱动程序。下面列出了不同的浏览器及其相应的驱动程序:
  Chrome:安装Selenium和chromedriver:安装Selenium:Selenium有多种语言版本,如java、ruby、python等,我们可以下载python版本。
   pip3 install selenium
  安装chromedriver:下载完成后,放在一个不需要权限的纯英文目录下。快速入门:
  现在以获取百度首页的简单例子来谈谈如何快速上手Selenium和chromedriver:
  from selenium import webdriver
# chromedriver的绝对路径
driver_path = r'D:\ProgramApp\chromedriver\chromedriver.exe'
# 初始化一个driver,并且指定chromedriver的路径
driver = webdriver.Chrome(executable_path=driver_path)
# 请求网页
driver.get("https://www.baidu.com/")
# 通过page_source获取网页源代码
print(driver.page_source)
  Selenium 常见操作:
  更多教程请参考:
  关闭页面: driver.close():关闭当前页面。 driver.quit():退出整个浏览器。定位元素: find_element_by_id:根据id查找元素。相当于:
   submitTag = driver.find_element_by_id('su')
submitTag1 = driver.find_element(By.ID,'su')
  find_element_by_class_name:根据类名查找元素。相当于:
   submitTag = driver.find_element_by_class_name('su')
submitTag1 = driver.find_element(By.CLASS_NAME,'su')
  find_element_by_name:根据name属性的值查找元素。相当于:
   submitTag = driver.find_element_by_name('email')
submitTag1 = driver.find_element(By.NAME,'email')
  find_element_by_tag_name:根据标签名称查找元素。相当于:
  submitTag = driver.find_element_by_tag_name('div')
submitTag1 = driver.find_element(By.TAG_NAME,'div')
  find_element_by_xpath:根据 xpath 语法获取元素。相当于:
   submitTag = driver.find_element_by_xpath('//div')
submitTag1 = driver.find_element(By.XPATH,'//div')
  find_element_by_css_selector:根据css选择器选择元素。相当于:
   submitTag = driver.find_element_by_css_selector('//div')
submitTag1 = driver.find_element(By.CSS_SELECTOR,'//div')
  注意 find_element 是获取第一个满足条件的元素。 find_elements 是获取所有满足条件的元素。
  操作表单元素:
  操作输入框:分为两步。第一步:找到这个元素。第二步:使用send_keys(value)填写数据。示例代码如下:
   inputTag = driver.find_element_by_id('kw')
inputTag.send_keys('python')
  使用clear方法清除输入框中的内容。示例代码如下:
   inputTag.clear()
  操作checkbox:因为要选中checkbox标签,可以在网页上用鼠标点击。因此,如果要选中复选框标签,请先选中此标签,然后再执行点击事件。示例代码如下:
   rememberTag = driver.find_element_by_name("rememberMe")
rememberTag.click()
  Select select:不能直接点击select元素。因为元素需要点击后被选中。这时候,selenium 专门为 select 标签提供了一个类 selenium.webdriver.support.ui.Select。将获取的元素作为参数传递给该类以创建该对象。您可以在将来使用此对象进行选择。示例代码如下:
   from selenium.webdriver.support.ui import Select
# 选中这个标签,然后使用Select创建对象
selectTag = Select(driver.find_element_by_name("jumpMenu"))
# 根据索引选择
selectTag.select_by_index(1)
# 根据值选择
selectTag.select_by_value("http://www.95yueba.com")
# 根据可视的文本选择
selectTag.select_by_visible_text("95秀客户端")
# 取消选中所有选项
selectTag.deselect_all()
  操作按钮:操作按钮的方法有很多种。比如单击、右键、双击等,这里是最常用的一种。只需点击。直接调用click函数就行了。示例代码如下:
   inputTag = driver.find_element_by_id('su')
inputTag.click()
  行为链:
  有时候页面上的操作可能会有很多步骤,那么这次可以使用鼠标行为链类ActionChains来完成。例如,现在您想将鼠标移动到一个元素并执行一个点击事件。那么示例代码如下:
  inputTag = driver.find_element_by_id('kw')
submitTag = driver.find_element_by_id('su')
actions = ActionChains(driver)
actions.move_to_element(inputTag)
actions.send_keys_to_element(inputTag,'python')
actions.move_to_element(submitTag)
actions.click(submitTag)
actions.perform()
  鼠标相关的操作较多。
  Cookie 操作:获取所有 Cookie:
   for cookie in driver.get_cookies():
print(cookie)
  根据cookie的key获取value:
   value = driver.get_cookie(key)
  删除所有 cookie:
   driver.delete_all_cookies()
  删除cookie:
   driver.delete_cookie(key)
  页面等待:
  如今,越来越多的网页使用 Ajax 技术,因此程序无法确定某个元素何时完全加载。如果实际页面等待时间过长,某个dom元素没有出来,而你的代码直接使用了这个WebElement,那么就会抛出NullPointer异常。为了解决这个问题。所以Selenium提供了两种等待方式:一种是隐式等待,另一种是显式等待。
  隐式等待:调用 driver.implicitly_wait。然后,在获取不可用元素之前,它会等待 10 秒。示例代码如下:
  driver = webdriver.Chrome(executable_path=driver_path)
driver.implicitly_wait(10)
# 请求网页
driver.get("https://www.douban.com/")
  显示等待:显示等待是表示在执行获取元素的操作之前已经建立了某种条件。也可以指定等待的最长时间,超过这个时间就会抛出异常。显示等待应在 selenium.webdriver.support.excepted_conditions 和 selenium.webdriver.support.ui.WebDriverWait 的预期条件下完成。示例代码如下:
   from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit() from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
  其他一些等待条件:
  切换页面:
  有时窗口中有很多子标签页。这个时候必须切换。 Selenium 提供了一个 switch_to_window 来切换。要切换到的特定页面可以在 driver.window_handles 中找到。示例代码如下:
  # 打开一个新的页面
self.driver.execute_script("window.open('"+url+"')")
# 切换到这个新的页面中
self.driver.switch_to_window(self.driver.window_handles[1])
  设置代理ip:
  有些网页有时会被频繁抓取。服务器发现你是爬虫后会屏蔽你的ip地址。这时候我们就可以更改代理ip了。更改代理ip,不同浏览器实现方式不同。下面以Chrome浏览器为例进行说明:
  from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://110.73.2.248:8123")
driver_path = r"D:\ProgramApp\chromedriver\chromedriver.exe"
driver = webdriver.Chrome(executable_path=driver_path,chrome_options=options)
driver.get('http://httpbin.org/ip')
  WebElement 元素:
  from selenium.webdriver.remote.webelement import WebElement 类是获取的每个元素的类。
  有一些常用的属性:
  get_attribute:此标签的属性值。 screentshot:获取当前页面的截图。此方法只能在驱动上使用。
  driver 的对象类也是继承自 WebElement。
  更多内容请阅读相关源码。
  转载于: 查看全部

  python抓取动态网页(快速入门:网页更新中的不同和XML的方式优点)
  动态网页数据获取 什么是 AJAX:
  AJAX(Asynchronouse JavaScript And XML)异步 JavaScript 和 XML。通过在后台与服务器交换少量数据,Ajax 可以使网页异步更新。这意味着可以在不重新加载整个网页的情况下更新网页的某些部分。如果内容需要更新,传统网页(不使用 Ajax)必须重新加载整个网页。因为传统的数据传输格式是XML语法。所以它被称为 AJAX。其实现在数据交互基本都是用JSON。使用AJAX加载的数据,即使使用JS将数据渲染到浏览器中,右击->查看网页源码也看不到ajax加载的数据,只能看到使用这个加载的html代码网址。
  ajax数据的获取方式:直接分析ajax调用的接口。然后通过代码请求这个接口。使用Selenium+chromedriver模拟浏览器行为获取数据。该方法的优缺点
  分析界面
  可以直接请求数据。无需做一些解析工作。代码量小,性能高。
  分析接口比较复杂,尤其是一些被js混淆的接口,必须有一定的js基础。很容易被发现是爬虫。
  硒
  直接模拟浏览器的行为。浏览器可以请求的内容也可以使用 selenium 请求。爬虫更稳定。
  大量代码。低性能。
  Selenium+chromedriver 获取动态数据:
  Selenium 相当于一个机器人。可以在浏览器上模拟人类的一些行为,在浏览器上自动处理一些行为,比如点击、填充数据、删除cookies等。 chromedriver是一个驱动Chrome浏览器的驱动,可以用来驱动浏览器当然,不同的浏览器有不同的驱动程序。下面列出了不同的浏览器及其相应的驱动程序:
  Chrome:安装Selenium和chromedriver:安装Selenium:Selenium有多种语言版本,如java、ruby、python等,我们可以下载python版本。
   pip3 install selenium
  安装chromedriver:下载完成后,放在一个不需要权限的纯英文目录下。快速入门:
  现在以获取百度首页的简单例子来谈谈如何快速上手Selenium和chromedriver:
  from selenium import webdriver
# chromedriver的绝对路径
driver_path = r'D:\ProgramApp\chromedriver\chromedriver.exe'
# 初始化一个driver,并且指定chromedriver的路径
driver = webdriver.Chrome(executable_path=driver_path)
# 请求网页
driver.get("https://www.baidu.com/";)
# 通过page_source获取网页源代码
print(driver.page_source)
  Selenium 常见操作:
  更多教程请参考:
  关闭页面: driver.close():关闭当前页面。 driver.quit():退出整个浏览器。定位元素: find_element_by_id:根据id查找元素。相当于:
   submitTag = driver.find_element_by_id('su')
submitTag1 = driver.find_element(By.ID,'su')
  find_element_by_class_name:根据类名查找元素。相当于:
   submitTag = driver.find_element_by_class_name('su')
submitTag1 = driver.find_element(By.CLASS_NAME,'su')
  find_element_by_name:根据name属性的值查找元素。相当于:
   submitTag = driver.find_element_by_name('email')
submitTag1 = driver.find_element(By.NAME,'email')
  find_element_by_tag_name:根据标签名称查找元素。相当于:
  submitTag = driver.find_element_by_tag_name('div')
submitTag1 = driver.find_element(By.TAG_NAME,'div')
  find_element_by_xpath:根据 xpath 语法获取元素。相当于:
   submitTag = driver.find_element_by_xpath('//div')
submitTag1 = driver.find_element(By.XPATH,'//div')
  find_element_by_css_selector:根据css选择器选择元素。相当于:
   submitTag = driver.find_element_by_css_selector('//div')
submitTag1 = driver.find_element(By.CSS_SELECTOR,'//div')
  注意 find_element 是获取第一个满足条件的元素。 find_elements 是获取所有满足条件的元素。
  操作表单元素:
  操作输入框:分为两步。第一步:找到这个元素。第二步:使用send_keys(value)填写数据。示例代码如下:
   inputTag = driver.find_element_by_id('kw')
inputTag.send_keys('python')
  使用clear方法清除输入框中的内容。示例代码如下:
   inputTag.clear()
  操作checkbox:因为要选中checkbox标签,可以在网页上用鼠标点击。因此,如果要选中复选框标签,请先选中此标签,然后再执行点击事件。示例代码如下:
   rememberTag = driver.find_element_by_name("rememberMe")
rememberTag.click()
  Select select:不能直接点击select元素。因为元素需要点击后被选中。这时候,selenium 专门为 select 标签提供了一个类 selenium.webdriver.support.ui.Select。将获取的元素作为参数传递给该类以创建该对象。您可以在将来使用此对象进行选择。示例代码如下:
   from selenium.webdriver.support.ui import Select
# 选中这个标签,然后使用Select创建对象
selectTag = Select(driver.find_element_by_name("jumpMenu"))
# 根据索引选择
selectTag.select_by_index(1)
# 根据值选择
selectTag.select_by_value("http://www.95yueba.com";)
# 根据可视的文本选择
selectTag.select_by_visible_text("95秀客户端")
# 取消选中所有选项
selectTag.deselect_all()
  操作按钮:操作按钮的方法有很多种。比如单击、右键、双击等,这里是最常用的一种。只需点击。直接调用click函数就行了。示例代码如下:
   inputTag = driver.find_element_by_id('su')
inputTag.click()
  行为链:
  有时候页面上的操作可能会有很多步骤,那么这次可以使用鼠标行为链类ActionChains来完成。例如,现在您想将鼠标移动到一个元素并执行一个点击事件。那么示例代码如下:
  inputTag = driver.find_element_by_id('kw')
submitTag = driver.find_element_by_id('su')
actions = ActionChains(driver)
actions.move_to_element(inputTag)
actions.send_keys_to_element(inputTag,'python')
actions.move_to_element(submitTag)
actions.click(submitTag)
actions.perform()
  鼠标相关的操作较多。
  Cookie 操作:获取所有 Cookie:
   for cookie in driver.get_cookies():
print(cookie)
  根据cookie的key获取value:
   value = driver.get_cookie(key)
  删除所有 cookie:
   driver.delete_all_cookies()
  删除cookie:
   driver.delete_cookie(key)
  页面等待:
  如今,越来越多的网页使用 Ajax 技术,因此程序无法确定某个元素何时完全加载。如果实际页面等待时间过长,某个dom元素没有出来,而你的代码直接使用了这个WebElement,那么就会抛出NullPointer异常。为了解决这个问题。所以Selenium提供了两种等待方式:一种是隐式等待,另一种是显式等待。
  隐式等待:调用 driver.implicitly_wait。然后,在获取不可用元素之前,它会等待 10 秒。示例代码如下:
  driver = webdriver.Chrome(executable_path=driver_path)
driver.implicitly_wait(10)
# 请求网页
driver.get("https://www.douban.com/";)
  显示等待:显示等待是表示在执行获取元素的操作之前已经建立了某种条件。也可以指定等待的最长时间,超过这个时间就会抛出异常。显示等待应在 selenium.webdriver.support.excepted_conditions 和 selenium.webdriver.support.ui.WebDriverWait 的预期条件下完成。示例代码如下:
   from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading";)
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit() from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading";)
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
  其他一些等待条件:
  切换页面:
  有时窗口中有很多子标签页。这个时候必须切换。 Selenium 提供了一个 switch_to_window 来切换。要切换到的特定页面可以在 driver.window_handles 中找到。示例代码如下:
  # 打开一个新的页面
self.driver.execute_script("window.open('"+url+"')")
# 切换到这个新的页面中
self.driver.switch_to_window(self.driver.window_handles[1])
  设置代理ip:
  有些网页有时会被频繁抓取。服务器发现你是爬虫后会屏蔽你的ip地址。这时候我们就可以更改代理ip了。更改代理ip,不同浏览器实现方式不同。下面以Chrome浏览器为例进行说明:
  from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://110.73.2.248:8123";)
driver_path = r"D:\ProgramApp\chromedriver\chromedriver.exe"
driver = webdriver.Chrome(executable_path=driver_path,chrome_options=options)
driver.get('http://httpbin.org/ip')
  WebElement 元素:
  from selenium.webdriver.remote.webelement import WebElement 类是获取的每个元素的类。
  有一些常用的属性:
  get_attribute:此标签的属性值。 screentshot:获取当前页面的截图。此方法只能在驱动上使用。
  driver 的对象类也是继承自 WebElement。
  更多内容请阅读相关源码。
  转载于:

python抓取动态网页(使用selenium.webdriver登录Facebook并获取公众人物的HTML页面)

网站优化优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2021-09-12 05:12 • 来自相关话题

  python抓取动态网页(使用selenium.webdriver登录Facebook并获取公众人物的HTML页面)
  使用 selenium.webdriver 登录 Facebook 并获取公众人物的 HTML 页面(例如),您可能需要从该页面抓取已发布的内容。 python如何获取网页的所有内容动态
<p>我发现使用 selemium.webdriver 时,我只能获取当前屏幕中网页的内容。例如,当我登录Facebook并想获取所有网页内容时,我得到的只是当前屏幕中稍后的几个,但实际上页面上有很多帖子(内容)。 查看全部

  python抓取动态网页(使用selenium.webdriver登录Facebook并获取公众人物的HTML页面)
  使用 selenium.webdriver 登录 Facebook 并获取公众人物的 HTML 页面(例如),您可能需要从该页面抓取已发布的内容。 python如何获取网页的所有内容动态
<p>我发现使用 selemium.webdriver 时,我只能获取当前屏幕中网页的内容。例如,当我登录Facebook并想获取所有网页内容时,我得到的只是当前屏幕中稍后的几个,但实际上页面上有很多帖子(内容)。

python抓取动态网页( 五一假期Python抓取动态网页信息的相关操作、网上教程编写出)

网站优化优采云 发表了文章 • 0 个评论 • 104 次浏览 • 2021-09-12 05:11 • 来自相关话题

  python抓取动态网页(
五一假期Python抓取动态网页信息的相关操作、网上教程编写出)
  
  5月1日放假学习Python爬取动态网页信息的相关操作,结合封面上的参考书和网上教程写出能满足需求的代码。从我第一次接触python开始,过程就经历了很多波折。为避免日后出现问题,暂时找不到相关资料来创建本文。
  准备工具:
  Python 3.8Google Chrome 浏览器 Googledriver
  测试网站:
  1.集思录(#cb)
  考前准备:
  1.配置python运行的环境变量,参考链接()
  *本次测试主要使用两种方式抓取动态网页数据,一种是requests和json解析;另一种是硒。 requests 方法速度快,但有些元素的链接信息无法捕获; selenium 方法通过模拟打开浏览器来捕获数据。速度比较慢,因为需要打开浏览器,但是可以爬取的信息比较慢。综合。
  抓取的主要内容如下:(网站部分可转债数据)
  
  通过请求获取网站信息:
  Python需要安装的相关脚本:Requests
  安装方法:以管理员身份运行cmd;输入pip install requests命令,安装成功后会有提示。一次装不下,多装几次。
  (前提是相关端口没有关闭)。如果pip版本不是最新的,会提醒你更新pip版本,pip的环境变量也要设置好。设置方法参考python的设置方法。
  请求获取代码如下:
  import requests
import json
url='https://www.jisilu.cn/data/cbnew/cb_list/?___jsl=LST___'
return_data = requests.get(url,verify = False)
js=return_data.json()
for i in js['rows']:
print(i['id']+" "+i['cell']['bond_nm']+" "+i['cell']['price'])
  最终结果如下:
  
  注意两点:
  找到正确的url:chrome打开头脑风暴记录网站(#cb)。点击F12按钮,在弹出的开发工具窗口中选择network,然后选择XHR,点击F5刷新。在名称栏中一一点击,找到您需要的XHR。通过预览可以发现“?__jsl=LST”对应的XHR就是我们要找的,在headers中可以找到对应的url。
  
  json 对请求的数据格式进行转换,方便数据查找。 json格式转换后,请求的数据格式与预览的格式一致。如果要定位到“国轩转债”一栏的数据,使用代码js['rows']['cell']['bond_nm']*selenium抓取网页数据:
  python需要安装的脚本:selenium(安装方法参考requests installation)
  配置浏览器对应的webdriver。以chrome为例,下载chrome版本对应的驱动(地址栏输入chrome://version,回车查看chrome版本)。放在chrome安装的文件夹下,设置环境变量。
  Selenium 爬取代码如下:
  from selenium import webdriver
import time
driver=webdriver.Chrome()
url1='https://www.jisilu.cn/data/cbnew/#cb'
bes=driver.get(url1)
time.sleep(5) #增加延时命令,等待元素加载
driver.find_element_by_tag_name("tr").click() #增加延时,等待元素加载
table_tr_list=driver.find_element_by_xpath("//*[@id='flex_cb']").find_elements_by_tag_name("tr") #后面一个element改成elements
for tr in table_tr_list:
if len(tr.get_attribute('id'))>0:
print(tr.find_element_by_xpath("//*[@id=%d]/td[1]/a"%(int(tr.get_attribute('id')))).text+" "+tr.find_element_by_xpath("//*[@id=%d]/td[2]"%(int(tr.get_attribute('id')))).text)
driver.quit()
  运行结果如下:
  
  注意三点:
  1、 应该添加一个延迟命令(time.sleep(5)),否则可能会出现找不到元素的错误(NoSuchElementException)
  2、使用find_element_by_xpath时,可以在web开发者中右键复制xpath,确认元素的路径。
  
  3、发送ID时,将字符转为数值,注意清除空字符
  捕获的数据也可以通过python保存在excel中。 查看全部

  python抓取动态网页(
五一假期Python抓取动态网页信息的相关操作、网上教程编写出)
  
  5月1日放假学习Python爬取动态网页信息的相关操作,结合封面上的参考书和网上教程写出能满足需求的代码。从我第一次接触python开始,过程就经历了很多波折。为避免日后出现问题,暂时找不到相关资料来创建本文。
  准备工具:
  Python 3.8Google Chrome 浏览器 Googledriver
  测试网站:
  1.集思录(#cb)
  考前准备:
  1.配置python运行的环境变量,参考链接()
  *本次测试主要使用两种方式抓取动态网页数据,一种是requests和json解析;另一种是硒。 requests 方法速度快,但有些元素的链接信息无法捕获; selenium 方法通过模拟打开浏览器来捕获数据。速度比较慢,因为需要打开浏览器,但是可以爬取的信息比较慢。综合。
  抓取的主要内容如下:(网站部分可转债数据)
  
  通过请求获取网站信息:
  Python需要安装的相关脚本:Requests
  安装方法:以管理员身份运行cmd;输入pip install requests命令,安装成功后会有提示。一次装不下,多装几次。
  (前提是相关端口没有关闭)。如果pip版本不是最新的,会提醒你更新pip版本,pip的环境变量也要设置好。设置方法参考python的设置方法。
  请求获取代码如下:
  import requests
import json
url='https://www.jisilu.cn/data/cbnew/cb_list/?___jsl=LST___'
return_data = requests.get(url,verify = False)
js=return_data.json()
for i in js['rows']:
print(i['id']+" "+i['cell']['bond_nm']+" "+i['cell']['price'])
  最终结果如下:
  
  注意两点:
  找到正确的url:chrome打开头脑风暴记录网站(#cb)。点击F12按钮,在弹出的开发工具窗口中选择network,然后选择XHR,点击F5刷新。在名称栏中一一点击,找到您需要的XHR。通过预览可以发现“?__jsl=LST”对应的XHR就是我们要找的,在headers中可以找到对应的url。
  
  json 对请求的数据格式进行转换,方便数据查找。 json格式转换后,请求的数据格式与预览的格式一致。如果要定位到“国轩转债”一栏的数据,使用代码js['rows']['cell']['bond_nm']*selenium抓取网页数据:
  python需要安装的脚本:selenium(安装方法参考requests installation)
  配置浏览器对应的webdriver。以chrome为例,下载chrome版本对应的驱动(地址栏输入chrome://version,回车查看chrome版本)。放在chrome安装的文件夹下,设置环境变量。
  Selenium 爬取代码如下:
  from selenium import webdriver
import time
driver=webdriver.Chrome()
url1='https://www.jisilu.cn/data/cbnew/#cb'
bes=driver.get(url1)
time.sleep(5) #增加延时命令,等待元素加载
driver.find_element_by_tag_name("tr").click() #增加延时,等待元素加载
table_tr_list=driver.find_element_by_xpath("//*[@id='flex_cb']").find_elements_by_tag_name("tr") #后面一个element改成elements
for tr in table_tr_list:
if len(tr.get_attribute('id'))>0:
print(tr.find_element_by_xpath("//*[@id=%d]/td[1]/a"%(int(tr.get_attribute('id')))).text+" "+tr.find_element_by_xpath("//*[@id=%d]/td[2]"%(int(tr.get_attribute('id')))).text)
driver.quit()
  运行结果如下:
  
  注意三点:
  1、 应该添加一个延迟命令(time.sleep(5)),否则可能会出现找不到元素的错误(NoSuchElementException)
  2、使用find_element_by_xpath时,可以在web开发者中右键复制xpath,确认元素的路径。
  
  3、发送ID时,将字符转为数值,注意清除空字符
  捕获的数据也可以通过python保存在excel中。

python抓取动态网页(.4win7框架:如何获取网页上动态加载的数据)

网站优化优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2021-09-12 05:11 • 来自相关话题

  python抓取动态网页(.4win7框架:如何获取网页上动态加载的数据)
  环境:python3.4
  win7
  框架:scrapy
  接上一篇,这次讲一下如何获取网页上动态加载的数据:
  作为初学者,我们在第一次接触爬虫的时候,一般只会抓取一些静态内容(如何区分静态内容和动态内容,这里不讲理论,教的是一些小方法):
  首先打开谷歌浏览器,然后按F12,就会弹出谷歌内置的开发者工具,先在“元素”下找到你需要抓取的内容;
  然后,在网页可视化界面右击,选择查看网页源代码。这个网页源码就是我们按照抓取静态网页的方法在这个网页上能看到的所有东西,而开发者工具可以看到一些我们在网页源码中看不到的东西;
  最后,通过对比我们在F12中查看的内容和网页源代码中的内容,我们可以初步判断哪些数据是静态加载的,哪些数据是动态加载的。
  ———————————————分割线————————————
  一般的请求方法有两种,post请求方法和get请求方法。这篇文章,我们先说说get请求方法。
  说到get请求,这应该是最常用的请求之一。表达 get 请求的最直观方式是什么?其实我们把网址放在地址栏中打开网页,这是一个get请求。
  ———————————————分割线————————————
  好的,现在我们进入正题:我们先通过一个例子来谈谈。当我们抓取一个大型购物网站的产品评论时:
  
  当我们点击1或2 3 4时,我们会发现网址根本没有变化。这意味着这些注释是动态加载的。然后我们将使用F12下的抓包工具来尝试捕获它们。 :(F12,然后选择“网络”),出现下图:
  
  接下来是最重要的:在可视化界面中,我们点击“2”按钮,让评论页面跳转到第二页,看能否顺利抓包:
  
  好的,可以看到有2个gif文件,2个png文件,还有一个脚本文件。一开始,我们不知道要检查哪个文件。好吧,最笨的办法,一一点击。 : 所以我都下单了,除了脚本文件,其他都是这样的:
  
  哈哈,就算没有,那我们也只能检查这个脚本文件了。看Response,发现只是一堆代码,查起来好像不方便?好的,没问题,我们试试预览,效果会很好。 . . 我发现结果很高兴听到:
  
  你看到了吗!评论评论,大家应该相信网站大佬的英文是绝对没问题的,不会像我一样给评论起个“pinglun”的!
  然后点击这条评论看看里面有什么:
  
  好的,就是我们想要的评论,所以这个文件所在的URL就是我们需要的,然后我们通过查看Headers来获取URL!
  
  URL是我们需要的网址(网址被马赛克抹掉了,对不起大家,因为我哥也怕被查水表),状态值为200表示访问成功,访问方法:GET,回显话题,使用get请求获取网页的动态加载数据。好了,今天的教程到此结束。什么?不构造一个获取请求?那请到我的第一篇博文找大神的爬虫教程链接~~~~
  好了,本文到此结束。我从头到尾都没有看到任何代码。哈哈,有时候教他们钓鱼不如教他们钓鱼。代码很重要,方法也很重要。有了这些分析方法,相信大家都能快速掌握获取动态网页内容的技巧。下一篇我们会讲如何使用post请求来获取网页的动态加载数据~我们下期再见 查看全部

  python抓取动态网页(.4win7框架:如何获取网页上动态加载的数据)
  环境:python3.4
  win7
  框架:scrapy
  接上一篇,这次讲一下如何获取网页上动态加载的数据:
  作为初学者,我们在第一次接触爬虫的时候,一般只会抓取一些静态内容(如何区分静态内容和动态内容,这里不讲理论,教的是一些小方法):
  首先打开谷歌浏览器,然后按F12,就会弹出谷歌内置的开发者工具,先在“元素”下找到你需要抓取的内容;
  然后,在网页可视化界面右击,选择查看网页源代码。这个网页源码就是我们按照抓取静态网页的方法在这个网页上能看到的所有东西,而开发者工具可以看到一些我们在网页源码中看不到的东西;
  最后,通过对比我们在F12中查看的内容和网页源代码中的内容,我们可以初步判断哪些数据是静态加载的,哪些数据是动态加载的。
  ———————————————分割线————————————
  一般的请求方法有两种,post请求方法和get请求方法。这篇文章,我们先说说get请求方法。
  说到get请求,这应该是最常用的请求之一。表达 get 请求的最直观方式是什么?其实我们把网址放在地址栏中打开网页,这是一个get请求。
  ———————————————分割线————————————
  好的,现在我们进入正题:我们先通过一个例子来谈谈。当我们抓取一个大型购物网站的产品评论时:
  
  当我们点击1或2 3 4时,我们会发现网址根本没有变化。这意味着这些注释是动态加载的。然后我们将使用F12下的抓包工具来尝试捕获它们。 :(F12,然后选择“网络”),出现下图:
  
  接下来是最重要的:在可视化界面中,我们点击“2”按钮,让评论页面跳转到第二页,看能否顺利抓包:
  
  好的,可以看到有2个gif文件,2个png文件,还有一个脚本文件。一开始,我们不知道要检查哪个文件。好吧,最笨的办法,一一点击。 : 所以我都下单了,除了脚本文件,其他都是这样的:
  
  哈哈,就算没有,那我们也只能检查这个脚本文件了。看Response,发现只是一堆代码,查起来好像不方便?好的,没问题,我们试试预览,效果会很好。 . . 我发现结果很高兴听到:
  
  你看到了吗!评论评论,大家应该相信网站大佬的英文是绝对没问题的,不会像我一样给评论起个“pinglun”的!
  然后点击这条评论看看里面有什么:
  
  好的,就是我们想要的评论,所以这个文件所在的URL就是我们需要的,然后我们通过查看Headers来获取URL!
  
  URL是我们需要的网址(网址被马赛克抹掉了,对不起大家,因为我哥也怕被查水表),状态值为200表示访问成功,访问方法:GET,回显话题,使用get请求获取网页的动态加载数据。好了,今天的教程到此结束。什么?不构造一个获取请求?那请到我的第一篇博文找大神的爬虫教程链接~~~~
  好了,本文到此结束。我从头到尾都没有看到任何代码。哈哈,有时候教他们钓鱼不如教他们钓鱼。代码很重要,方法也很重要。有了这些分析方法,相信大家都能快速掌握获取动态网页内容的技巧。下一篇我们会讲如何使用post请求来获取网页的动态加载数据~我们下期再见

python抓取动态网页( 爬取猫眼电影的应用技巧和基本知识点的抓取教程)

网站优化优采云 发表了文章 • 0 个评论 • 58 次浏览 • 2021-09-11 19:16 • 来自相关话题

  python抓取动态网页(
爬取猫眼电影的应用技巧和基本知识点的抓取教程)
  python 网络爬虫(动态网页)
  时间:2021-08-08
  本文章向大家介绍python网络爬虫(动态网页),主要包括python网络爬虫(动态网页)用例、应用技巧、基础知识点总结和注意事项。有一定的参考价值,是需要的。朋友们可以参考一下。
  内容
  抓取动态网页
  新手开始学习爬虫,一般是从爬豆瓣开始。学会了爬豆瓣后,本来想爬其他网页玩的,后来就选择爬猫眼电影了。和豆瓣一样,我们进入猫眼电影,查看源码,可以看到很多我们想要的,但是用requests解析后,里面什么都没有。一开始还以为自己看错了,后来问了别人才知道,这是一个需要浏览器浏览的动态网页,或者是移动鼠标后才生成HTML代码。因此,为了能够顺便抓取到我们需要的信息,我们需要使用工具来模仿用户行为来生成HTML代码。
  分析网站
  解析网站时,使用requests库进行访问,也可以使用Xpath或BeautifulSoup进行解析。
  import requests
import lxml
from bs4 import BeautifulSoup
  def get_one_page(url):
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'}
response=requests.get(url,headers=headers)
soup = BeautifulSoup(response.text,'html.parser')
titles = soup.find_all('title')
print(titles)
# if response.status_code==200:# 状态响应码为200 表示正常访问
# return response.text
# return None

def main():
url='https://maoyan.com/board/4?offset=0'
html=get_one_page(url)
# print(html)

main()
  分析以上代码,发现没有我们需要的内容
  显示最后一个
  什么都解析不了,应该是用Javascript动态生成信息,所以我也学了动态Javascript抓取教程。
  在 Python 中使用 Selenium 执行 JavaScript
  Selenium 是一个强大的网页抓取工具,最初是为网站automated 测试而开发的。 Selenium 可以让浏览器自动加载网站,获取需要的数据,甚至可以对网页进行截图,或者判断网站上是否发生了某些操作。
  安装 iSelenium
  首先安装 Selenium
  pip install Selenium
  下载 PhantomJS
  安装完成后,我们还需要安装PhantomJS。因为是全功能浏览器,不是python库,所以不能用pip安装
  浏览器输入
  根据需要自行下载,下载后解压,将解压包内的bin文件夹添加到环境变量中
  driver = webdriver.PhantomJS(executable_path=r'D:/phantomjs/phantomjs-2.1.1-windows/bin/phantomjs.exe')
driver.get('https://pythonscraping.com/pages/javascript/ajaxDemo.html')
time.sleep(3)
print(driver.find_element_by_id('content').text)
driver.close()
'''
Here is some important text you want to retrieve!
A button to click!
'''
  测试完成后,即可完成安装。
  网页抓取
  我们设置了一个等待时间,因为我们需要等待 Javascript 完全加载才能获取所有信息。
  代码如下:
  from selenium import webdriver #引入网页驱动包
import time
from selenium.webdriver.remote.webelement import WebElement
from selenium.common.exceptions import StaleElementReferenceException
def waitForLoad(driver):
elem = driver.find_element_by_tag_name("html")
count = 0
while True:
count += 1
if count > 20:
print('Timing out after 10 seconds and returning')
return
time.sleep(.5)
try:
elem == driver.find_element_by_tag_name('html')
except StaleElementReferenceException:
return

driver = webdriver.PhantomJS(executable_path=r'D:/phantomjs/phantomjs-2.1.1-windows/bin/phantomjs.exe')
url='https://maoyan.com/board/4?offset=0'
driver.get(url)
waitForLoad(driver) #等待网页JavaScript加载完成
print(driver.page_source)
driver.close() #最后要将driver关闭
  网页html的部分截图。
  成功爬取电影和爬取豆瓣是一样的。代码参考《Python Web Crawler 权威指南》 查看全部

  python抓取动态网页(
爬取猫眼电影的应用技巧和基本知识点的抓取教程)
  python 网络爬虫(动态网页)
  时间:2021-08-08
  本文章向大家介绍python网络爬虫(动态网页),主要包括python网络爬虫(动态网页)用例、应用技巧、基础知识点总结和注意事项。有一定的参考价值,是需要的。朋友们可以参考一下。
  内容
  抓取动态网页
  新手开始学习爬虫,一般是从爬豆瓣开始。学会了爬豆瓣后,本来想爬其他网页玩的,后来就选择爬猫眼电影了。和豆瓣一样,我们进入猫眼电影,查看源码,可以看到很多我们想要的,但是用requests解析后,里面什么都没有。一开始还以为自己看错了,后来问了别人才知道,这是一个需要浏览器浏览的动态网页,或者是移动鼠标后才生成HTML代码。因此,为了能够顺便抓取到我们需要的信息,我们需要使用工具来模仿用户行为来生成HTML代码。
  分析网站
  解析网站时,使用requests库进行访问,也可以使用Xpath或BeautifulSoup进行解析。
  import requests
import lxml
from bs4 import BeautifulSoup
  def get_one_page(url):
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'}
response=requests.get(url,headers=headers)
soup = BeautifulSoup(response.text,'html.parser')
titles = soup.find_all('title')
print(titles)
# if response.status_code==200:# 状态响应码为200 表示正常访问
# return response.text
# return None

def main():
url='https://maoyan.com/board/4?offset=0'
html=get_one_page(url)
# print(html)

main()
  分析以上代码,发现没有我们需要的内容
  显示最后一个
  什么都解析不了,应该是用Javascript动态生成信息,所以我也学了动态Javascript抓取教程。
  在 Python 中使用 Selenium 执行 JavaScript
  Selenium 是一个强大的网页抓取工具,最初是为网站automated 测试而开发的。 Selenium 可以让浏览器自动加载网站,获取需要的数据,甚至可以对网页进行截图,或者判断网站上是否发生了某些操作。
  安装 iSelenium
  首先安装 Selenium
  pip install Selenium
  下载 PhantomJS
  安装完成后,我们还需要安装PhantomJS。因为是全功能浏览器,不是python库,所以不能用pip安装
  浏览器输入
  根据需要自行下载,下载后解压,将解压包内的bin文件夹添加到环境变量中
  driver = webdriver.PhantomJS(executable_path=r'D:/phantomjs/phantomjs-2.1.1-windows/bin/phantomjs.exe')
driver.get('https://pythonscraping.com/pages/javascript/ajaxDemo.html')
time.sleep(3)
print(driver.find_element_by_id('content').text)
driver.close()
'''
Here is some important text you want to retrieve!
A button to click!
'''
  测试完成后,即可完成安装。
  网页抓取
  我们设置了一个等待时间,因为我们需要等待 Javascript 完全加载才能获取所有信息。
  代码如下:
  from selenium import webdriver #引入网页驱动包
import time
from selenium.webdriver.remote.webelement import WebElement
from selenium.common.exceptions import StaleElementReferenceException
def waitForLoad(driver):
elem = driver.find_element_by_tag_name("html")
count = 0
while True:
count += 1
if count > 20:
print('Timing out after 10 seconds and returning')
return
time.sleep(.5)
try:
elem == driver.find_element_by_tag_name('html')
except StaleElementReferenceException:
return

driver = webdriver.PhantomJS(executable_path=r'D:/phantomjs/phantomjs-2.1.1-windows/bin/phantomjs.exe')
url='https://maoyan.com/board/4?offset=0'
driver.get(url)
waitForLoad(driver) #等待网页JavaScript加载完成
print(driver.page_source)
driver.close() #最后要将driver关闭
  网页html的部分截图。
  成功爬取电影和爬取豆瓣是一样的。代码参考《Python Web Crawler 权威指南》

python抓取动态网页(爬取网页思路的改变–selenuim的介绍和基本使用在爬虫领域)

网站优化优采云 发表了文章 • 0 个评论 • 80 次浏览 • 2021-09-11 12:09 • 来自相关话题

  python抓取动态网页(爬取网页思路的改变–selenuim的介绍和基本使用在爬虫领域)
  抓取网页的思路变化-selenuim的介绍和基本使用
  在爬虫领域,网页可以分为主要内容全部出现在HTML中的[静态网页]和需要通过执行JavaScript来显示主题内容的[动态网页]。
  假设爬虫程序需要爬取:2020中国大学排名
  访问网站时,会发现点击第二页、第三页...时,页面部分刷新,URL不会改变。这时候使用[requests]库访问,* *只获取*第一页的数据,后面18页是不可用的。
  这时候就需要了解:爬虫、浏览器和WebDriver的关系,可以浏览相关网页,这里不再赘述。 . .
  以下是重点:
  Selenium 是一个程序。国外大神团队打造的“轮子”本质上是一个成熟稳定的WebDriver程序,并在此基础上提供了丰富的功能。它也是一个开源浏览器自动化项目,提供了一组命令接口。我们可以用它向浏览器发送指令,浏览器会执行特定的操作。网页渲染完成后,会抓取对应的字段。
  传送门:(轮盘下载地址)
  温馨提示:开始练习前,请按照Selenium官方文档安装Selenium,并下载相应的浏览器WebDriver。
  元素定位方法(如下图1):
  
  以下爬取了本网站所有涉及[校名,如清华大学等]的567所学校。
  只需导入两个包。 . .
  有效代码少于 30 行。 .
  可以自己练习,基础语法,欢迎在评论区留言,有很多注意事项才可以写(看到留言会回复~~)。
  简介:
  导入selenium库,xlwt库(可选);定义一个函数parselweb,传入两个参数,url和school_info;驱动浏览器,打开url链接,css_selector选择器找到网页页码对应的css元素(如图)2),设置为制造循环(从嵌套的if语句中去掉页面“0”;(调用方法:find_element_by_css_selector(),没有s的元素)嵌套for循环,css_selector选择器遍历页面所有类=“div>.name-cn”,调用text提取文本;(调用方法:find_elements_by_css_selector())school_info调用append () 方法依次添加字符串文本,print() 打印列表元素。
  
  所有代码如下:
  from selenium import webdriver
import xlwt
#1.【selenium模块】遥控win10自带的Edge浏览器打开指定网页;
#2.查看页面共19页,撇去数字“0”,开始循环点击网页;
#3.每次点击一个网页页码,则使用【css选择器】定位指定【字段】 并提取出来存入变量 school_info;
#4.【xlwt模块】写入数据
def parselweb(url,school_info):
driver = webdriver.Edge(executable_path=&#39;msedgedriver.exe&#39;)
driver.get(url)

for i in range(20):
if i == 0:
pass
else:
driver.find_element_by_css_selector(".ant-pagination-item.ant-pagination-item-" + str(i)).click()
text1 = driver.find_elements_by_css_selector("div>.name-cn")
for ii in text1:
school_name_cn = ii.text
school_info.append(school_name_cn)
print(school_info)
print("接下来将数据传入Excel")
return school_info

def xlsbook(school_info):
xls = xlwt.Workbook()
sheet = xls.add_sheet("最好大学排名")
for val in range(len(school_info)):
sheet.write(val,0,school_info[val])
xls.save("d:/zuimeidaxue02.xls")
def main():
school_info = []
url = "https://www.shanghairanking.cn ... ot%3B
parselweb(url,school_info)
xlsbook(school_info)
main()
  运行后附上结果:
  
  
  待更新。 . . 查看全部

  python抓取动态网页(爬取网页思路的改变–selenuim的介绍和基本使用在爬虫领域)
  抓取网页的思路变化-selenuim的介绍和基本使用
  在爬虫领域,网页可以分为主要内容全部出现在HTML中的[静态网页]和需要通过执行JavaScript来显示主题内容的[动态网页]。
  假设爬虫程序需要爬取:2020中国大学排名
  访问网站时,会发现点击第二页、第三页...时,页面部分刷新,URL不会改变。这时候使用[requests]库访问,* *只获取*第一页的数据,后面18页是不可用的。
  这时候就需要了解:爬虫、浏览器和WebDriver的关系,可以浏览相关网页,这里不再赘述。 . .
  以下是重点:
  Selenium 是一个程序。国外大神团队打造的“轮子”本质上是一个成熟稳定的WebDriver程序,并在此基础上提供了丰富的功能。它也是一个开源浏览器自动化项目,提供了一组命令接口。我们可以用它向浏览器发送指令,浏览器会执行特定的操作。网页渲染完成后,会抓取对应的字段。
  传送门:(轮盘下载地址)
  温馨提示:开始练习前,请按照Selenium官方文档安装Selenium,并下载相应的浏览器WebDriver。
  元素定位方法(如下图1):
  
  以下爬取了本网站所有涉及[校名,如清华大学等]的567所学校。
  只需导入两个包。 . .
  有效代码少于 30 行。 .
  可以自己练习,基础语法,欢迎在评论区留言,有很多注意事项才可以写(看到留言会回复~~)。
  简介:
  导入selenium库,xlwt库(可选);定义一个函数parselweb,传入两个参数,url和school_info;驱动浏览器,打开url链接,css_selector选择器找到网页页码对应的css元素(如图)2),设置为制造循环(从嵌套的if语句中去掉页面“0”;(调用方法:find_element_by_css_selector(),没有s的元素)嵌套for循环,css_selector选择器遍历页面所有类=“div>.name-cn”,调用text提取文本;(调用方法:find_elements_by_css_selector())school_info调用append () 方法依次添加字符串文本,print() 打印列表元素。
  
  所有代码如下:
  from selenium import webdriver
import xlwt
#1.【selenium模块】遥控win10自带的Edge浏览器打开指定网页;
#2.查看页面共19页,撇去数字“0”,开始循环点击网页;
#3.每次点击一个网页页码,则使用【css选择器】定位指定【字段】 并提取出来存入变量 school_info;
#4.【xlwt模块】写入数据
def parselweb(url,school_info):
driver = webdriver.Edge(executable_path=&#39;msedgedriver.exe&#39;)
driver.get(url)

for i in range(20):
if i == 0:
pass
else:
driver.find_element_by_css_selector(".ant-pagination-item.ant-pagination-item-" + str(i)).click()
text1 = driver.find_elements_by_css_selector("div>.name-cn")
for ii in text1:
school_name_cn = ii.text
school_info.append(school_name_cn)
print(school_info)
print("接下来将数据传入Excel")
return school_info

def xlsbook(school_info):
xls = xlwt.Workbook()
sheet = xls.add_sheet("最好大学排名")
for val in range(len(school_info)):
sheet.write(val,0,school_info[val])
xls.save("d:/zuimeidaxue02.xls")
def main():
school_info = []
url = "https://www.shanghairanking.cn ... ot%3B
parselweb(url,school_info)
xlsbook(school_info)
main()
  运行后附上结果:
  
  
  待更新。 . .

python抓取动态网页(【干货】如何使用代码快速的进行目标内容的位置定位)

网站优化优采云 发表了文章 • 0 个评论 • 57 次浏览 • 2021-09-11 12:06 • 来自相关话题

  python抓取动态网页(【干货】如何使用代码快速的进行目标内容的位置定位)
  先试试爬虫
  前言
  通过前几章的介绍,我们对什么是爬虫有了初步的了解,同时对如何抓取网页有了一个大致的了解。从本章开始,我们将从理论走向实践,结合实际操作进一步加深理解。
  因为使用python爬取页面的工具有很多,比如requests、scrapy、PhantomJS、Splash等,而且解析爬取的页面的工具也很多。这里我们从最简单的开始,使用requests库和beautifSoup工具进行静态页面爬取和解析。
  在基本功扎实之后,我们可以使用更加灵活的工具,不仅可以静态爬行,也可以动态爬行;不仅可以抓取单个页面,还可以递归深度抓取。同时,结合其他渲染、存储、机器学习等工具,我们可以对数据进行处理、加工、建模和展示。
  实战开始
  废话不多说,先从今天的例子开始,抓拍安徒生童话中著名的“丑小鸭”。 “欲善其事,必先利其器”。在开始之前,我们需要做好准备。
  安装命令:pip install beautifulsoup4
  
  
  开始爬行的第一步是找到收录童话“丑小鸭”的链接。我们在这里使用的链接是:
  
  找到我们的目标链接后,第二步是分析网页。要分析什么?当然是分析我们要爬到哪里的内容。
  根据我们之前的介绍,我们爬虫的目的是爬取丑小鸭的文本。根据这个目标,我们首先需要研究网页的组成。那么如何查看网页呢?一般是在浏览器的开发者模式下完成的。对于chrome浏览器,我们可以使用快捷键F12查看,如图:
  
  左边是网页显示的内容,右边是网页的HTML文档。
  通过对右边页面的分析,我们可以观察到我们需要抓取的页面内容在一个
  在标签中:
  
  既然找到了页面,也找到了需要爬取的内容的位置,那么现在我们需要解决一个问题:如何使用代码快速定位目标内容?
  理想情况下,我们想要这个
  tag有一个唯一的属性(通常是id或者class),那么我们可以直接通过这个属性来定位位置。
  但不幸的是,在我们的目标标签中
  在
  ,它没有属性,更不用说独特的属性了。由于直接访问的愿望已经落空,只能使用间接访问。
  通常有两种间接方法:
  至于哪个更好,我们会根据实际情况进行分析和选择。我们在这里演示了这两种方法。
  第一种方式
  我们基于
  父标签div
  标签有唯一的class属性articleContent来查找div标签,然后根据父子关系找到p标签,然后通过正则表达式过滤掉无用的内容,得到最终结果。
  # -*- coding: utf-8 -*-
# @Author : 一凡
import requests
from bs4 import BeautifulSoup
# 正则模块
import re
# 爬取的网页
url = r"https://www.ppzuowen.com/book/ ... ot%3B
response = requests.get(url)
response.encoding=None
result = response.text
# 再次封装,获取具体标签内的内容
bs = BeautifulSoup(result, &#39;html.parser&#39;)
psg = bs.select(&#39;.articleContent > p&#39;)
title = bs.select(&#39;title&#39;)[0].text.split(&#39;_&#39;)[0]
txt = &#39;&#39;.join(str(x) for x in psg)
res = re.sub(r&#39;&#39;, "", txt)
result = res.split("(1844年)")[0]
print(&#39;标题:&#39;, title)
print(&#39;原文:&#39;, result)
  效果:
  
  实现的代码主要分为两部分:第一部分是页面的抓取,如:
  # 爬取的网页链接
url = r"https://www.ppzuowen.com/book/ ... ot%3B
response = requests.get(url)
response .encoding=None
result = response .text
print(result)
  
  这部分内容和我们在浏览器的开发者模式下看到的HTML源代码完全一样。
  第二部分是页面分析。
  我们之前介绍过,HTLML 页面本质上是一棵 DOM 树。我们用树遍历子节点来遍历HTML页面中的标签,如:
  再次打包获取特定标签中的内容
  bs = BeautifulSoup(result, &#39;html.parser&#39;)
psg = bs.select(&#39;.articleContent > p&#39;)
  这里先将页面信息转换成xml格式的文档(注意:HTML文档是一种特殊类型的xml文档),然后根据css的语法找到p标签的内容。
  第二种方式
  我们原来的方式写的代码是这样的:
  # 爬取的网页链接
url=r"https://www.ppzuowen.com/book/ ... ot%3B
response = requests.get(url)
response .encoding=None
result = response .text
# 再次封装,获取具体标签内的内容
bs = BeautifulSoup(result,&#39;html.parser&#39;)
# 具体标签
print("---------解析后的数据---------------")
# print(bs.span)
a = {}
# 获取已爬取内容中的p签内容
data = bs.find_all(&#39;p&#39;)
# 循环打印输出
for tmp in data:
print(tmp)
print(&#39;********************&#39;)
  然后我们检查输出结果,但与预期不符,是这样的:
  
  获取的内容是分段的,收录了很多其他无用的信息。其实这些都是在实际爬取过程中常见的,并不是每一次爬取都一步到位,需要不断调试。
  经过分析,我们可以用表达式过滤掉无用的信息,用字符串拼接函数拼接得到我们期望的内容。
  最终代码如下:
  # 爬取的网页链接
url=r"https://www.ppzuowen.com/book/ ... ot%3B
response = requests.get(url)
response .encoding=None
result = r.text
# 再次封装,获取具体标签内的内容
bs = BeautifulSoup(result,&#39;html.parser&#39;)
# 具体标签
print("---------解析后的数据---------------")
# print(bs.span)
a = {}
# 获取已爬取内容中的p签内容
data=bs.find_all(&#39;p&#39;)
result = &#39; &#39;
# 循环打印输出
for tmp in data:
if &#39;1844年&#39; in tmp.text:
break
result+=tmp.text

print(result)
  上面,我们已经说明了如何通过两种方式抓取一些简单的网页信息。当然,对于抓取到的内容,我们有时不仅需要输出,还可能需要存储。
  通常的存储方式是文件和数据库的形式。我们稍后会详细介绍。
  如果您想交流软件测试、接口测试、自动化测试、技术同行、持续集成和面试方面的经验。有兴趣的可以去893694563,群里会不定期分享测试数据。
  如果文章对你有帮助,请联系发财,给我点个赞。感谢您的支持。您的点赞是我不断更新的动力。 查看全部

  python抓取动态网页(【干货】如何使用代码快速的进行目标内容的位置定位)
  先试试爬虫
  前言
  通过前几章的介绍,我们对什么是爬虫有了初步的了解,同时对如何抓取网页有了一个大致的了解。从本章开始,我们将从理论走向实践,结合实际操作进一步加深理解。
  因为使用python爬取页面的工具有很多,比如requests、scrapy、PhantomJS、Splash等,而且解析爬取的页面的工具也很多。这里我们从最简单的开始,使用requests库和beautifSoup工具进行静态页面爬取和解析。
  在基本功扎实之后,我们可以使用更加灵活的工具,不仅可以静态爬行,也可以动态爬行;不仅可以抓取单个页面,还可以递归深度抓取。同时,结合其他渲染、存储、机器学习等工具,我们可以对数据进行处理、加工、建模和展示。
  实战开始
  废话不多说,先从今天的例子开始,抓拍安徒生童话中著名的“丑小鸭”。 “欲善其事,必先利其器”。在开始之前,我们需要做好准备。
  安装命令:pip install beautifulsoup4
  
  
  开始爬行的第一步是找到收录童话“丑小鸭”的链接。我们在这里使用的链接是:
  
  找到我们的目标链接后,第二步是分析网页。要分析什么?当然是分析我们要爬到哪里的内容。
  根据我们之前的介绍,我们爬虫的目的是爬取丑小鸭的文本。根据这个目标,我们首先需要研究网页的组成。那么如何查看网页呢?一般是在浏览器的开发者模式下完成的。对于chrome浏览器,我们可以使用快捷键F12查看,如图:
  
  左边是网页显示的内容,右边是网页的HTML文档。
  通过对右边页面的分析,我们可以观察到我们需要抓取的页面内容在一个
  在标签中:
  
  既然找到了页面,也找到了需要爬取的内容的位置,那么现在我们需要解决一个问题:如何使用代码快速定位目标内容?
  理想情况下,我们想要这个
  tag有一个唯一的属性(通常是id或者class),那么我们可以直接通过这个属性来定位位置。
  但不幸的是,在我们的目标标签中
  在
  ,它没有属性,更不用说独特的属性了。由于直接访问的愿望已经落空,只能使用间接访问。
  通常有两种间接方法:
  至于哪个更好,我们会根据实际情况进行分析和选择。我们在这里演示了这两种方法。
  第一种方式
  我们基于
  父标签div
  标签有唯一的class属性articleContent来查找div标签,然后根据父子关系找到p标签,然后通过正则表达式过滤掉无用的内容,得到最终结果。
  # -*- coding: utf-8 -*-
# @Author : 一凡
import requests
from bs4 import BeautifulSoup
# 正则模块
import re
# 爬取的网页
url = r"https://www.ppzuowen.com/book/ ... ot%3B
response = requests.get(url)
response.encoding=None
result = response.text
# 再次封装,获取具体标签内的内容
bs = BeautifulSoup(result, &#39;html.parser&#39;)
psg = bs.select(&#39;.articleContent > p&#39;)
title = bs.select(&#39;title&#39;)[0].text.split(&#39;_&#39;)[0]
txt = &#39;&#39;.join(str(x) for x in psg)
res = re.sub(r&#39;&#39;, "", txt)
result = res.split("(1844年)")[0]
print(&#39;标题:&#39;, title)
print(&#39;原文:&#39;, result)
  效果:
  
  实现的代码主要分为两部分:第一部分是页面的抓取,如:
  # 爬取的网页链接
url = r"https://www.ppzuowen.com/book/ ... ot%3B
response = requests.get(url)
response .encoding=None
result = response .text
print(result)
  
  这部分内容和我们在浏览器的开发者模式下看到的HTML源代码完全一样。
  第二部分是页面分析。
  我们之前介绍过,HTLML 页面本质上是一棵 DOM 树。我们用树遍历子节点来遍历HTML页面中的标签,如:
  再次打包获取特定标签中的内容
  bs = BeautifulSoup(result, &#39;html.parser&#39;)
psg = bs.select(&#39;.articleContent > p&#39;)
  这里先将页面信息转换成xml格式的文档(注意:HTML文档是一种特殊类型的xml文档),然后根据css的语法找到p标签的内容。
  第二种方式
  我们原来的方式写的代码是这样的:
  # 爬取的网页链接
url=r"https://www.ppzuowen.com/book/ ... ot%3B
response = requests.get(url)
response .encoding=None
result = response .text
# 再次封装,获取具体标签内的内容
bs = BeautifulSoup(result,&#39;html.parser&#39;)
# 具体标签
print("---------解析后的数据---------------")
# print(bs.span)
a = {}
# 获取已爬取内容中的p签内容
data = bs.find_all(&#39;p&#39;)
# 循环打印输出
for tmp in data:
print(tmp)
print(&#39;********************&#39;)
  然后我们检查输出结果,但与预期不符,是这样的:
  
  获取的内容是分段的,收录了很多其他无用的信息。其实这些都是在实际爬取过程中常见的,并不是每一次爬取都一步到位,需要不断调试。
  经过分析,我们可以用表达式过滤掉无用的信息,用字符串拼接函数拼接得到我们期望的内容。
  最终代码如下:
  # 爬取的网页链接
url=r"https://www.ppzuowen.com/book/ ... ot%3B
response = requests.get(url)
response .encoding=None
result = r.text
# 再次封装,获取具体标签内的内容
bs = BeautifulSoup(result,&#39;html.parser&#39;)
# 具体标签
print("---------解析后的数据---------------")
# print(bs.span)
a = {}
# 获取已爬取内容中的p签内容
data=bs.find_all(&#39;p&#39;)
result = &#39; &#39;
# 循环打印输出
for tmp in data:
if &#39;1844年&#39; in tmp.text:
break
result+=tmp.text

print(result)
  上面,我们已经说明了如何通过两种方式抓取一些简单的网页信息。当然,对于抓取到的内容,我们有时不仅需要输出,还可能需要存储。
  通常的存储方式是文件和数据库的形式。我们稍后会详细介绍。
  如果您想交流软件测试、接口测试、自动化测试、技术同行、持续集成和面试方面的经验。有兴趣的可以去893694563,群里会不定期分享测试数据。
  如果文章对你有帮助,请联系发财,给我点个赞。感谢您的支持。您的点赞是我不断更新的动力。

python抓取动态网页(本文实例讲述Python3实现抓取javascript动态生成的html网页功能 )

网站优化优采云 发表了文章 • 0 个评论 • 104 次浏览 • 2021-09-11 04:05 • 来自相关话题

  python抓取动态网页(本文实例讲述Python3实现抓取javascript动态生成的html网页功能
)
  本文以Python3为例,实现抓取javascript动态生成的html网页的功能。分享给大家,供大家参考,如下:
  使用urllib等抓取网页只能读取网页的静态源文件,不能读取javascript生成的内容。
  原因是urllib是瞬间抓取的。不等待javascript的加载延迟,因此页面中javascript生成的内容无法被urllib读取。
  真的没有办法读取javascript生成的内容吗?不!
  这里是一个python库:selenium,本文使用的版本是2.44.0
  先安装:
  
pip install -U selenium
  以下三个例子说明了它的用法:
  [示例 0]
  打开火狐浏览器
  使用给定的 url 地址加载页面
  
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://www.baidu.com/')
  [示例 1]
  打开火狐浏览器
  加载百度主页
  搜索“seleniumhq”
  关闭浏览器
  
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
browser = webdriver.Firefox()
browser.get('http://www.baidu.com')
assert '百度' in browser.title
elem = browser.find_element_by_name('p') # Find the search box
elem.send_keys('seleniumhq' + Keys.RETURN) # 模拟按键
browser.quit()
  [示例 2]
  Selenium WebDriver 常用于测试网络程序。以下是使用 Python 标准库 unittest 的示例:
  
import unittest
class BaiduTestCase(unittest.TestCase):
def setUp(self):
self.browser = webdriver.Firefox()
self.addCleanup(self.browser.quit)
def testPageTitle(self):
self.browser.get('http://www.baidu.com')
self.assertIn('百度', self.browser.title)
if __name__ == '__main__':
unittest.main(verbosity=2)
  希望这篇文章对你的 Python 编程有所帮助。
   查看全部

  python抓取动态网页(本文实例讲述Python3实现抓取javascript动态生成的html网页功能
)
  本文以Python3为例,实现抓取javascript动态生成的html网页的功能。分享给大家,供大家参考,如下:
  使用urllib等抓取网页只能读取网页的静态源文件,不能读取javascript生成的内容。
  原因是urllib是瞬间抓取的。不等待javascript的加载延迟,因此页面中javascript生成的内容无法被urllib读取。
  真的没有办法读取javascript生成的内容吗?不!
  这里是一个python库:selenium,本文使用的版本是2.44.0
  先安装:
  
pip install -U selenium
  以下三个例子说明了它的用法:
  [示例 0]
  打开火狐浏览器
  使用给定的 url 地址加载页面
  
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://www.baidu.com/')
  [示例 1]
  打开火狐浏览器
  加载百度主页
  搜索“seleniumhq”
  关闭浏览器
  
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
browser = webdriver.Firefox()
browser.get('http://www.baidu.com')
assert '百度' in browser.title
elem = browser.find_element_by_name('p') # Find the search box
elem.send_keys('seleniumhq' + Keys.RETURN) # 模拟按键
browser.quit()
  [示例 2]
  Selenium WebDriver 常用于测试网络程序。以下是使用 Python 标准库 unittest 的示例:
  
import unittest
class BaiduTestCase(unittest.TestCase):
def setUp(self):
self.browser = webdriver.Firefox()
self.addCleanup(self.browser.quit)
def testPageTitle(self):
self.browser.get('http://www.baidu.com')
self.assertIn('百度', self.browser.title)
if __name__ == '__main__':
unittest.main(verbosity=2)
  希望这篇文章对你的 Python 编程有所帮助。
  

python抓取动态网页(Python学习群:审查网页元素与网页源码是什么? )

网站优化优采云 发表了文章 • 0 个评论 • 48 次浏览 • 2021-09-11 04:02 • 来自相关话题

  python抓取动态网页(Python学习群:审查网页元素与网页源码是什么?
)
  简介
  以下代码是一个使用python实现的爬取动态网页的网络爬虫。此页面上最新最好的内容是由 Java 动态生成的。检查网页的元素是否与网页的源代码不同。
  
  我创建了一个学习Python的小学习圈,为大家提供了一个共同讨论和学习Python的平台。欢迎加入Python学习群:960410445讨论视频分享学习。 Python是未来的发展方向,正在挑战我们的分析能力和认识世界的方式。因此,我们与时俱进,迎接变化,不断成长。掌握Python核心技术才是真正的价值。
  
  以上是网页的源代码
  
  
  以上是回顾网页元素
  所以在这里你不能简单地使用正则表达式来获取内容。
  以下是获取内容并存入数据库的完整思路和源码。
  实施思路:
  抓取实际访问的动态页面的url-使用正则表达式获取需要的内容-解析内容-存储内容
  以上过程部分文字说明:
  获取实际访问过的动态页面的url:
  在火狐浏览器中,右键打开插件,使用**firebug review element** *(如果没有该项,安装firebug插件),找到并打开**网络(NET)** 选项卡。重新加载网页,获取网页的响应信息,包括连接地址。每个连接地址都可以在浏览器中打开。这个网站动态网页的访问地址是:
  源代码
  注:python版本为2.7
   查看全部

  python抓取动态网页(Python学习群:审查网页元素与网页源码是什么?
)
  简介
  以下代码是一个使用python实现的爬取动态网页的网络爬虫。此页面上最新最好的内容是由 Java 动态生成的。检查网页的元素是否与网页的源代码不同。
  
  我创建了一个学习Python的小学习圈,为大家提供了一个共同讨论和学习Python的平台。欢迎加入Python学习群:960410445讨论视频分享学习。 Python是未来的发展方向,正在挑战我们的分析能力和认识世界的方式。因此,我们与时俱进,迎接变化,不断成长。掌握Python核心技术才是真正的价值。
  
  以上是网页的源代码
  
  
  以上是回顾网页元素
  所以在这里你不能简单地使用正则表达式来获取内容。
  以下是获取内容并存入数据库的完整思路和源码。
  实施思路:
  抓取实际访问的动态页面的url-使用正则表达式获取需要的内容-解析内容-存储内容
  以上过程部分文字说明:
  获取实际访问过的动态页面的url:
  在火狐浏览器中,右键打开插件,使用**firebug review element** *(如果没有该项,安装firebug插件),找到并打开**网络(NET)** 选项卡。重新加载网页,获取网页的响应信息,包括连接地址。每个连接地址都可以在浏览器中打开。这个网站动态网页的访问地址是:
  源代码
  注:python版本为2.7
  

python抓取动态网页(python如何检测网页中是否存在动态加载的数据?(图))

网站优化优采云 发表了文章 • 0 个评论 • 44 次浏览 • 2021-09-11 04:00 • 来自相关话题

  python抓取动态网页(python如何检测网页中是否存在动态加载的数据?(图))
  在使用python爬虫技术采集data信息时,我们经常会遇到在返回的网页信息中,无法抓取到动态加载的可用数据。例如,当获取某个网页中的产品价格时,就会出现这种现象。如下所示。本文将实现对网页中类似动态加载数据的抓取。
  
  1. 那么什么是动态加载的数据?
  通过requests模块爬取的数据每次都看不到。部分数据是通过非浏览器地址栏中的url请求获取的。但是通过其他请求请求的数据,那么这些通过其他请求请求的数据就是动态加载的数据。 (猜测是我们访问这个页面的时候js代码会发送get请求,从其他url获取数据)
  2. 如何检测网页中是否有动态加载的数据?
  在当前页面打开抓包工具,抓包地址栏中url对应的数据包,在数据包的响应标签中搜索我们要抓取的数据,如果找到搜索结果,数据不是动态加载的,否则表示数据是动态加载的。如图:
  
  或者在要爬取的页面上右键,显示该网页的源代码。搜索我们要抓取的数据。如果找到结果,说明数据不是动态加载的,否则说明数据是动态加载的。如图:
  
  3.如果数据是动态加载的,我们如何捕获动态加载的数据?
  在抓取动态加载的数据信息时,首先需要根据动态加载技术在浏览器的网络监视器中选择网络请求的类型,然后通过一一过滤的方式查询预览信息中的关键数据,并得到对应的请求地址,最后分析信息。具体步骤如下:
<p>在浏览器中,快捷键F12打开开发者工具,然后在网络类型中选择Network(网络监视器)并选择JS,然后按快捷键F5刷新,如下图。 查看全部

  python抓取动态网页(python如何检测网页中是否存在动态加载的数据?(图))
  在使用python爬虫技术采集data信息时,我们经常会遇到在返回的网页信息中,无法抓取到动态加载的可用数据。例如,当获取某个网页中的产品价格时,就会出现这种现象。如下所示。本文将实现对网页中类似动态加载数据的抓取。
  
  1. 那么什么是动态加载的数据?
  通过requests模块爬取的数据每次都看不到。部分数据是通过非浏览器地址栏中的url请求获取的。但是通过其他请求请求的数据,那么这些通过其他请求请求的数据就是动态加载的数据。 (猜测是我们访问这个页面的时候js代码会发送get请求,从其他url获取数据)
  2. 如何检测网页中是否有动态加载的数据?
  在当前页面打开抓包工具,抓包地址栏中url对应的数据包,在数据包的响应标签中搜索我们要抓取的数据,如果找到搜索结果,数据不是动态加载的,否则表示数据是动态加载的。如图:
  
  或者在要爬取的页面上右键,显示该网页的源代码。搜索我们要抓取的数据。如果找到结果,说明数据不是动态加载的,否则说明数据是动态加载的。如图:
  
  3.如果数据是动态加载的,我们如何捕获动态加载的数据?
  在抓取动态加载的数据信息时,首先需要根据动态加载技术在浏览器的网络监视器中选择网络请求的类型,然后通过一一过滤的方式查询预览信息中的关键数据,并得到对应的请求地址,最后分析信息。具体步骤如下:
<p>在浏览器中,快捷键F12打开开发者工具,然后在网络类型中选择Network(网络监视器)并选择JS,然后按快捷键F5刷新,如下图。

python抓取动态网页(常见的反爬机制及处理方式(一)|)

网站优化优采云 发表了文章 • 0 个评论 • 63 次浏览 • 2021-09-13 11:13 • 来自相关话题

  python抓取动态网页(常见的反爬机制及处理方式(一)|)
  常见的防爬机制及处理方法
  1、Headers Anti-Crawler:Cookie、Referer、User-Agent
  解决方法:通过 F12 获取 headers 并将它们传递给 requests.get() 方法
  2、IP 限制:网站according
  常见的防爬机制及处理方法
  1、Headers Anti-Crawler:Cookie、Referer、User-Agent
  解决方法:通过 F12 获取 headers 并将它们传递给 requests.get() 方法
  2、IP限制:网站根据IP地址访问频率进行反爬,短时间IP访问
  解决方案:
  1、构建自己的IP代理池,每次访问随机选择代理,并经常更新代理池
  2、购买开放代理或私有代理IP
  3、降低爬取速度
  3、User-Agent 限制:类似于IP限制
  解决方案:构建自己的User-Agent池,每次访问随机选择
  5、查询参数或表单数据的认证(salt、sign)
  解决方法:找到JS文件,分析JS处理方式,用Python同样处理
  6、处理响应内容
  解决方法:打印查看响应内容,使用xpath或者常规处理
  python 中对 headers 和 formdata 的常规处理
  1、pycharm 访问方式:Ctrl + r,选择Regex
  2、Process 标头和表单数据
  (.*): (.*)
  "1":"1":"2",
  3、点击全部替换
  民政部网站数据采集
  目标:抓取中华人民共和国最新的县级以上行政区划代码
  网址:-民政数据-行政部门代码
  实施步骤
  1、民政数据中提取最新行政区划代码链接网站
  最新在上,命名格式:X,2019,中华人民共和国县级以上行政区划代码
  
import requests
from lxml import etree
import re

url = 'http://www.mca.gov.cn/article/sj/xzqh/2019/'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'}
html = requests.get(url, headers=headers).text
parse_html = etree.HTML(html)
article_list = parse_html.xpath('//a[@class="artitlelist"]')

for article in article_list:
title = article.xpath('./@title')[0]
# 正则匹配title中包含这个字符串的链接
if title.endswith('代码'):
# 获取到第1个就停止即可,第1个永远是最新的链接
two_link = 'http://www.mca.gov.cn' + article.xpath('./@href')[0]
print(two_link)
break
  2、从二级页面链接中提取真实链接(反爬-响应网页内容中嵌入的JS,指向新的网页链接)
  向二级页面链接发送请求获取响应内容,查看嵌入的JS代码
  定期提取真实二级页面链接
  
# 爬取二级“假”链接
two_html = requests.get(two_link, headers=headers).text
# 从二级页面的响应中提取真实的链接(此处为JS动态加载跳转的地址)
new_two_link = re.findall(r'window.location.href="(.*?)" rel="external nofollow" rel="external nofollow" ', two_html, re.S)[0]
  3、在数据库表中查询此链接是否被爬取过,构建增量爬虫
  在数据库中创建一个版本表来存储爬取的链接
  检查程序每次执行时和版本表中的记录,看是否被爬取过
  
cursor.execute('select * from version')
result = self.cursor.fetchall()
if result:
if result[-1][0] == two_link:
print('已是最新')
else:
# 有更新,开始抓取
# 将链接再重新插入version表记录
  4、代码实现
  
import requests
from lxml import etree
import re
import pymysql
class GovementSpider(object):
def __init__(self):
self.url = 'http://www.mca.gov.cn/article/sj/xzqh/2019/'
self.headers = {'User-Agent': 'Mozilla/5.0'}
# 创建2个对象
self.db = pymysql.connect('127.0.0.1', 'root', '123456', 'govdb', charset='utf8')
self.cursor = self.db.cursor()
# 获取假链接
def get_false_link(self):
html = requests.get(url=self.url, headers=self.headers).text
# 此处隐藏了真实的二级页面的url链接,真实的在假的响应网页中,通过js脚本生成,
# 假的链接在网页中可以访问,但是爬取到的内容却不是我们想要的
parse_html = etree.HTML(html)
a_list = parse_html.xpath('//a[@class="artitlelist"]')
for a in a_list:
# get()方法:获取某个属性的值
title = a.get('title')
if title.endswith('代码'):
# 获取到第1个就停止即可,第1个永远是最新的链接
false_link = 'http://www.mca.gov.cn' + a.get('href')
print("二级“假”链接的网址为", false_link)
break
# 提取真链接
self.incr_spider(false_link)
# 增量爬取函数
def incr_spider(self, false_link):
self.cursor.execute('select url from version where url=%s', [false_link])
# fetchall: (('http://xxxx.html',),)
result = self.cursor.fetchall()
# not result:代表数据库version表中无数据
if not result:
self.get_true_link(false_link)
# 可选操作: 数据库version表中只保留最新1条数据
self.cursor.execute("delete from version")
# 把爬取后的url插入到version表中
self.cursor.execute('insert into version values(%s)', [false_link])
self.db.commit()
else:
print('数据已是最新,无须爬取')
# 获取真链接
def get_true_link(self, false_link):
# 先获取假链接的响应,然后根据响应获取真链接
html = requests.get(url=false_link, headers=self.headers).text
# 从二级页面的响应中提取真实的链接(此处为JS动态加载跳转的地址)
re_bds = r'window.location.href="(.*?)" rel="external nofollow" rel="external nofollow" '
pattern = re.compile(re_bds, re.S)
true_link = pattern.findall(html)[0]
self.save_data(true_link) # 提取真链接的数据
# 用xpath直接提取数据
def save_data(self, true_link):
html = requests.get(url=true_link, headers=self.headers).text
# 基准xpath,提取每个信息的节点列表对象
parse_html = etree.HTML(html)
tr_list = parse_html.xpath('//tr[@height="19"]')
for tr in tr_list:
code = tr.xpath('./td[2]/text()')[0].strip() # 行政区划代码
name = tr.xpath('./td[3]/text()')[0].strip() # 单位名称
print(name, code)
# 主函数
def main(self):
self.get_false_link()
if __name__ == '__main__':
spider = GovementSpider()
spider.main()
  动态加载数据捕获-Ajax
  特点
  右键->查看网页源代码,无需具体数据
  滚动鼠标滚轮或其他动作时加载
  楣
  F12打开控制台,选择XHR异步加载数据包,找到抓取网络数据包的页面动作
  通过XHR获取json文件的URL地址-->Header-->General-->Request URL
  通过XHR-->Header-->查询字符串参数
  豆瓣电影数据采集案例
  目标
  地址:豆瓣电影-排行榜-剧情
  type_name=%E5%89%A7%E6%83%85&type=11&interval_id=100:90&action=
  目标:抓取电影名称、电影评分
  F12 数据包捕获 (XHR)
  1、Request URL(基本 URL 地址):
  2、Query String Paramaters(查询参数)
  
# 查询参数如下:
type: 13 # 电影类型
interval_id: 100:90
action: '[{},{},{}]'
start: 0 # 每次加载电影的起始索引值
limit: 20 # 每次加载的电影数量
  json 文件位于以下地址:
  基本 URL 地址 + 查询参数
  ''+'type=11&interval_id=100%3A90&action=&start=20&limit=20'
  代码实现
  
import requests
import time
from fake_useragent import UserAgent
class DoubanSpider(object):
def __init__(self):
self.base_url = 'https://movie.douban.com/j/chart/top_list?'
self.i = 0
def get_html(self, params):
headers = {'User-Agent': UserAgent().random}
res = requests.get(url=self.base_url, params=params, headers=headers)
res.encoding = 'utf-8'
html = res.json() # 将json格式的字符串转为python数据类型
self.parse_html(html) # 直接调用解析函数
def parse_html(self, html):
# html: [{电影1信息},{电影2信息},{}]
item = {}
for one in html:
item['name'] = one['title'] # 电影名
item['score'] = one['score'] # 评分
item['time'] = one['release_date'] # 打印测试
# 打印显示
print(item)
self.i += 1
# 获取电影总数
def get_total(self, typ):
# 异步动态加载的数据 都可以在XHR数据抓包
url = 'https://movie.douban.com/j/chart/top_list_count?type={}&interval_id=100%3A90'.format(typ)
ua = UserAgent()
html = requests.get(url=url, headers={'User-Agent': ua.random}).json()
total = html['total']
return total
def main(self):
typ = input('请输入电影类型(剧情|喜剧|动作):')
typ_dict = {'剧情': '11', '喜剧': '24', '动作': '5'}
typ = typ_dict[typ]
total = self.get_total(typ) # 获取该类型电影总数量
for page in range(0, int(total), 20):
params = {
'type': typ,
'interval_id': '100:90',
'action': '',
'start': str(page),
'limit': '20'}
self.get_html(params)
time.sleep(1)
print('爬取的电影的数量:', self.i)
if __name__ == '__main__':
spider = DoubanSpider()
spider.main()
  腾讯招聘数据抓取(Ajax)
  确定 URL 地址和目标
  网址:百度搜索腾讯招聘-查看职位
  目标:职位、工作职责、工作要求
  需求与分析
  查看网页源代码,我们知道所有需要的数据都是Ajax动态加载的
  通过F12获取网络数据包进行分析
  一级页面爬取数据:职位
  在二级页面抓取数据:工作职责、工作要求
  一级页面json地址(pageIndex在变化,时间戳不检查)
  {}&pageSize=10&language=zh-cn&area=cn
  二级页面地址(postId正在变化,可以在主页面获取)
  {}&language=zh-cn
  useragents.py 文件
  
ua_list = [
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)',
]
  
import time
import json
import random
import requests
from useragents import ua_list
class TencentSpider(object):
def __init__(self):
self.one_url = 'https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1563912271089&countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=&pageIndex={}&pageSize=10&language=zh-cn&area=cn'
self.two_url = 'https://careers.tencent.com/tencentcareer/api/post/ByPostId?timestamp=1563912374645&postId={}&language=zh-cn'
self.f = open('tencent.json', 'a') # 打开文件
self.item_list = [] # 存放抓取的item字典数据
# 获取响应内容函数
def get_page(self, url):
headers = {'User-Agent': random.choice(ua_list)}
html = requests.get(url=url, headers=headers).text
html = json.loads(html) # json格式字符串转为Python数据类型
return html
# 主线函数: 获取所有数据
def parse_page(self, one_url):
html = self.get_page(one_url)
item = {}
for job in html['Data']['Posts']:
item['name'] = job['RecruitPostName'] # 名称
post_id = job['PostId'] # postId,拿postid为了拼接二级页面地址
# 拼接二级地址,获取职责和要求
two_url = self.two_url.format(post_id)
item['duty'], item['require'] = self.parse_two_page(two_url)
print(item)
self.item_list.append(item) # 添加到大列表中
# 解析二级页面函数
def parse_two_page(self, two_url):
html = self.get_page(two_url)
duty = html['Data']['Responsibility'] # 工作责任
duty = duty.replace('\r\n', '').replace('\n', '') # 去掉换行
require = html['Data']['Requirement'] # 工作要求
require = require.replace('\r\n', '').replace('\n', '') # 去掉换行
return duty, require
# 获取总页数
def get_numbers(self):
url = self.one_url.format(1)
html = self.get_page(url)
numbers = int(html['Data']['Count']) // 10 + 1 # 每页有10个推荐
return numbers
def main(self):
number = self.get_numbers()
for page in range(1, 3):
one_url = self.one_url.format(page)
self.parse_page(one_url)
# 保存到本地json文件:json.dump
json.dump(self.item_list, self.f, ensure_ascii=False)
self.f.close()
if __name__ == '__main__':
start = time.time()
spider = TencentSpider()
spider.main()
end = time.time()
print('执行时间:%.2f' % (end - start))
  以上是本文的全部内容。希望对大家的学习有所帮助,也希望大家多多支持Scripthome。 查看全部

  python抓取动态网页(常见的反爬机制及处理方式(一)|)
  常见的防爬机制及处理方法
  1、Headers Anti-Crawler:Cookie、Referer、User-Agent
  解决方法:通过 F12 获取 headers 并将它们传递给 requests.get() 方法
  2、IP 限制:网站according
  常见的防爬机制及处理方法
  1、Headers Anti-Crawler:Cookie、Referer、User-Agent
  解决方法:通过 F12 获取 headers 并将它们传递给 requests.get() 方法
  2、IP限制:网站根据IP地址访问频率进行反爬,短时间IP访问
  解决方案:
  1、构建自己的IP代理池,每次访问随机选择代理,并经常更新代理池
  2、购买开放代理或私有代理IP
  3、降低爬取速度
  3、User-Agent 限制:类似于IP限制
  解决方案:构建自己的User-Agent池,每次访问随机选择
  5、查询参数或表单数据的认证(salt、sign)
  解决方法:找到JS文件,分析JS处理方式,用Python同样处理
  6、处理响应内容
  解决方法:打印查看响应内容,使用xpath或者常规处理
  python 中对 headers 和 formdata 的常规处理
  1、pycharm 访问方式:Ctrl + r,选择Regex
  2、Process 标头和表单数据
  (.*): (.*)
  "1":"1":"2",
  3、点击全部替换
  民政部网站数据采集
  目标:抓取中华人民共和国最新的县级以上行政区划代码
  网址:-民政数据-行政部门代码
  实施步骤
  1、民政数据中提取最新行政区划代码链接网站
  最新在上,命名格式:X,2019,中华人民共和国县级以上行政区划代码
  
import requests
from lxml import etree
import re

url = 'http://www.mca.gov.cn/article/sj/xzqh/2019/'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'}
html = requests.get(url, headers=headers).text
parse_html = etree.HTML(html)
article_list = parse_html.xpath('//a[@class="artitlelist"]')

for article in article_list:
title = article.xpath('./@title')[0]
# 正则匹配title中包含这个字符串的链接
if title.endswith('代码'):
# 获取到第1个就停止即可,第1个永远是最新的链接
two_link = 'http://www.mca.gov.cn' + article.xpath('./@href')[0]
print(two_link)
break
  2、从二级页面链接中提取真实链接(反爬-响应网页内容中嵌入的JS,指向新的网页链接)
  向二级页面链接发送请求获取响应内容,查看嵌入的JS代码
  定期提取真实二级页面链接
  
# 爬取二级“假”链接
two_html = requests.get(two_link, headers=headers).text
# 从二级页面的响应中提取真实的链接(此处为JS动态加载跳转的地址)
new_two_link = re.findall(r'window.location.href="(.*?)" rel="external nofollow" rel="external nofollow" ', two_html, re.S)[0]
  3、在数据库表中查询此链接是否被爬取过,构建增量爬虫
  在数据库中创建一个版本表来存储爬取的链接
  检查程序每次执行时和版本表中的记录,看是否被爬取过
  
cursor.execute('select * from version')
result = self.cursor.fetchall()
if result:
if result[-1][0] == two_link:
print('已是最新')
else:
# 有更新,开始抓取
# 将链接再重新插入version表记录
  4、代码实现
  
import requests
from lxml import etree
import re
import pymysql
class GovementSpider(object):
def __init__(self):
self.url = 'http://www.mca.gov.cn/article/sj/xzqh/2019/'
self.headers = {'User-Agent': 'Mozilla/5.0'}
# 创建2个对象
self.db = pymysql.connect('127.0.0.1', 'root', '123456', 'govdb', charset='utf8')
self.cursor = self.db.cursor()
# 获取假链接
def get_false_link(self):
html = requests.get(url=self.url, headers=self.headers).text
# 此处隐藏了真实的二级页面的url链接,真实的在假的响应网页中,通过js脚本生成,
# 假的链接在网页中可以访问,但是爬取到的内容却不是我们想要的
parse_html = etree.HTML(html)
a_list = parse_html.xpath('//a[@class="artitlelist"]')
for a in a_list:
# get()方法:获取某个属性的值
title = a.get('title')
if title.endswith('代码'):
# 获取到第1个就停止即可,第1个永远是最新的链接
false_link = 'http://www.mca.gov.cn' + a.get('href')
print("二级“假”链接的网址为", false_link)
break
# 提取真链接
self.incr_spider(false_link)
# 增量爬取函数
def incr_spider(self, false_link):
self.cursor.execute('select url from version where url=%s', [false_link])
# fetchall: (('http://xxxx.html',),)
result = self.cursor.fetchall()
# not result:代表数据库version表中无数据
if not result:
self.get_true_link(false_link)
# 可选操作: 数据库version表中只保留最新1条数据
self.cursor.execute("delete from version")
# 把爬取后的url插入到version表中
self.cursor.execute('insert into version values(%s)', [false_link])
self.db.commit()
else:
print('数据已是最新,无须爬取')
# 获取真链接
def get_true_link(self, false_link):
# 先获取假链接的响应,然后根据响应获取真链接
html = requests.get(url=false_link, headers=self.headers).text
# 从二级页面的响应中提取真实的链接(此处为JS动态加载跳转的地址)
re_bds = r'window.location.href="(.*?)" rel="external nofollow" rel="external nofollow" '
pattern = re.compile(re_bds, re.S)
true_link = pattern.findall(html)[0]
self.save_data(true_link) # 提取真链接的数据
# 用xpath直接提取数据
def save_data(self, true_link):
html = requests.get(url=true_link, headers=self.headers).text
# 基准xpath,提取每个信息的节点列表对象
parse_html = etree.HTML(html)
tr_list = parse_html.xpath('//tr[@height="19"]')
for tr in tr_list:
code = tr.xpath('./td[2]/text()')[0].strip() # 行政区划代码
name = tr.xpath('./td[3]/text()')[0].strip() # 单位名称
print(name, code)
# 主函数
def main(self):
self.get_false_link()
if __name__ == '__main__':
spider = GovementSpider()
spider.main()
  动态加载数据捕获-Ajax
  特点
  右键->查看网页源代码,无需具体数据
  滚动鼠标滚轮或其他动作时加载
  楣
  F12打开控制台,选择XHR异步加载数据包,找到抓取网络数据包的页面动作
  通过XHR获取json文件的URL地址-->Header-->General-->Request URL
  通过XHR-->Header-->查询字符串参数
  豆瓣电影数据采集案例
  目标
  地址:豆瓣电影-排行榜-剧情
  type_name=%E5%89%A7%E6%83%85&type=11&interval_id=100:90&action=
  目标:抓取电影名称、电影评分
  F12 数据包捕获 (XHR)
  1、Request URL(基本 URL 地址):
  2、Query String Paramaters(查询参数)
  
# 查询参数如下:
type: 13 # 电影类型
interval_id: 100:90
action: '[{},{},{}]'
start: 0 # 每次加载电影的起始索引值
limit: 20 # 每次加载的电影数量
  json 文件位于以下地址:
  基本 URL 地址 + 查询参数
  ''+'type=11&interval_id=100%3A90&action=&start=20&limit=20'
  代码实现
  
import requests
import time
from fake_useragent import UserAgent
class DoubanSpider(object):
def __init__(self):
self.base_url = 'https://movie.douban.com/j/chart/top_list?'
self.i = 0
def get_html(self, params):
headers = {'User-Agent': UserAgent().random}
res = requests.get(url=self.base_url, params=params, headers=headers)
res.encoding = 'utf-8'
html = res.json() # 将json格式的字符串转为python数据类型
self.parse_html(html) # 直接调用解析函数
def parse_html(self, html):
# html: [{电影1信息},{电影2信息},{}]
item = {}
for one in html:
item['name'] = one['title'] # 电影名
item['score'] = one['score'] # 评分
item['time'] = one['release_date'] # 打印测试
# 打印显示
print(item)
self.i += 1
# 获取电影总数
def get_total(self, typ):
# 异步动态加载的数据 都可以在XHR数据抓包
url = 'https://movie.douban.com/j/chart/top_list_count?type={}&interval_id=100%3A90'.format(typ)
ua = UserAgent()
html = requests.get(url=url, headers={'User-Agent': ua.random}).json()
total = html['total']
return total
def main(self):
typ = input('请输入电影类型(剧情|喜剧|动作):')
typ_dict = {'剧情': '11', '喜剧': '24', '动作': '5'}
typ = typ_dict[typ]
total = self.get_total(typ) # 获取该类型电影总数量
for page in range(0, int(total), 20):
params = {
'type': typ,
'interval_id': '100:90',
'action': '',
'start': str(page),
'limit': '20'}
self.get_html(params)
time.sleep(1)
print('爬取的电影的数量:', self.i)
if __name__ == '__main__':
spider = DoubanSpider()
spider.main()
  腾讯招聘数据抓取(Ajax)
  确定 URL 地址和目标
  网址:百度搜索腾讯招聘-查看职位
  目标:职位、工作职责、工作要求
  需求与分析
  查看网页源代码,我们知道所有需要的数据都是Ajax动态加载的
  通过F12获取网络数据包进行分析
  一级页面爬取数据:职位
  在二级页面抓取数据:工作职责、工作要求
  一级页面json地址(pageIndex在变化,时间戳不检查)
  {}&pageSize=10&language=zh-cn&area=cn
  二级页面地址(postId正在变化,可以在主页面获取)
  {}&language=zh-cn
  useragents.py 文件
  
ua_list = [
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)',
]
  
import time
import json
import random
import requests
from useragents import ua_list
class TencentSpider(object):
def __init__(self):
self.one_url = 'https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1563912271089&countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=&pageIndex={}&pageSize=10&language=zh-cn&area=cn'
self.two_url = 'https://careers.tencent.com/tencentcareer/api/post/ByPostId?timestamp=1563912374645&postId={}&language=zh-cn'
self.f = open('tencent.json', 'a') # 打开文件
self.item_list = [] # 存放抓取的item字典数据
# 获取响应内容函数
def get_page(self, url):
headers = {'User-Agent': random.choice(ua_list)}
html = requests.get(url=url, headers=headers).text
html = json.loads(html) # json格式字符串转为Python数据类型
return html
# 主线函数: 获取所有数据
def parse_page(self, one_url):
html = self.get_page(one_url)
item = {}
for job in html['Data']['Posts']:
item['name'] = job['RecruitPostName'] # 名称
post_id = job['PostId'] # postId,拿postid为了拼接二级页面地址
# 拼接二级地址,获取职责和要求
two_url = self.two_url.format(post_id)
item['duty'], item['require'] = self.parse_two_page(two_url)
print(item)
self.item_list.append(item) # 添加到大列表中
# 解析二级页面函数
def parse_two_page(self, two_url):
html = self.get_page(two_url)
duty = html['Data']['Responsibility'] # 工作责任
duty = duty.replace('\r\n', '').replace('\n', '') # 去掉换行
require = html['Data']['Requirement'] # 工作要求
require = require.replace('\r\n', '').replace('\n', '') # 去掉换行
return duty, require
# 获取总页数
def get_numbers(self):
url = self.one_url.format(1)
html = self.get_page(url)
numbers = int(html['Data']['Count']) // 10 + 1 # 每页有10个推荐
return numbers
def main(self):
number = self.get_numbers()
for page in range(1, 3):
one_url = self.one_url.format(page)
self.parse_page(one_url)
# 保存到本地json文件:json.dump
json.dump(self.item_list, self.f, ensure_ascii=False)
self.f.close()
if __name__ == '__main__':
start = time.time()
spider = TencentSpider()
spider.main()
end = time.time()
print('执行时间:%.2f' % (end - start))
  以上是本文的全部内容。希望对大家的学习有所帮助,也希望大家多多支持Scripthome。

python抓取动态网页(Python爬虫小程序,爬取百度贴吧网页文件,新手练手的好案例)

网站优化优采云 发表了文章 • 0 个评论 • 73 次浏览 • 2021-09-12 17:01 • 来自相关话题

  python抓取动态网页(Python爬虫小程序,爬取百度贴吧网页文件,新手练手的好案例)
  内容
  本文文章帮助初学者理清网络爬虫的思路。 文章 的内容并不深奥。主要是通过案例帮助大家学习爬虫程序。学习了这些基础工具之后,你的爬虫之路才刚刚开始。 文章的内容来自我博客中关于python爬虫的章节。更多内容请参考我博客的网络爬虫专栏。特别提示:转载请注明出处。
  0、crawler 介绍
  在做任何事情之前,先弄清楚你为什么要这样做,以及如何去做。
  网络爬虫简介:网络爬虫的目的,企业获取数据的方式,可以作为爬虫的编程语言,以及爬虫爬取数据的步骤
  一、静态文件捕获(响应文件中存在的数据)
  大部分数据直接写在静态文件上。这里的静态文件通常是指在一定时间内不会发生变化且不需要与后台交互的网页。
  1. 首先确认响应文件中是否存在抓取到的数据
  2.分析页面结构,观察URL地址规律
  1)查看网页元素的布局,预览整体结构,并使用控制台进行分析
  2)检查浏览网页时元素结构是否发生变化(如翻页)
  3)检查页面重定向时URL地址是否发生变化(判断是否发生请求转发或重定向),如果有,去JS代码中查找变化原因
  3.开始编写数据捕获代码
  4. 开始编写我的第一个爬虫程序
  Python爬虫入门,最简单的爬虫代码,网站如何判断是人为操作还是爬虫程序操作,对url参数中的中文参数进行编码,一个基于百度搜索的爬虫程序
  完成上述案例后,可以再做一个案例来练手。 Python爬虫小程序,爬取百度贴吧网页文件,新手练习的好案例。
  5.多级页面爬取思路
  以上两种情况都是抓取一级页面。一级页面是指打开一个网页,只抓取网页上的内容,而二级页面是一级页面的基础,你点击一个内容,这个内容往往是一个链接,它带你到另一个页面,这是二级页面。在做爬虫的时候,我们一般都是先下载一级页面。这个页面没有我们要爬取的数据,但是收录了网站的链接,里面存放着我们要的数据。采集完所有的链接,我们就拥有了所有的二级页面,你也拥有了所有的数据。这时候就可以去二级页面爬取数据了。有二级页面和三级页面和四级页面,但原理是一样的。
  我们来看看如何抓取二级页面的内容。
  Python爬虫,4567电影网电影信息爬取,二次页面处理方案
  二、动态文件捕获(响应文件中不存在的数据)
  这部分的数据不是存储在响应内容中,而是存储在Ajax XML文件或JS文件中,并且随着你的操作动态变化。
  1.如果你发现你想要的内容已经不在响应文件中了,那很有可能是使用ajax动态生成的
  2.F12 进入控制台抓包,刷新页面或执行某些动作,查看XHR异步加载的数据包内容
  1)GET 请求:检查Request Headers请求头,检查请求头是怎么做的,是否需要伪装请求头。
  查看查询字符串参数,查看请求参数,这些参数大多收录在URL中
  2)Post 请求:检查Request Headers请求头,检查请求头是怎么做的,是否需要伪装请求头。
  查看FormData表单数据,看post请求发送时封装了哪些数据,这些数据哪些是动态的,哪些是静态的,以及如何生成动态进一步分析(主要通过JS代码分析)
  3. 观察Form的查询参数或数据模式。如果需要进一步抓取分析处理,应该分析JS文件
  4.使用 request.get().json() 获取json数据,使用列表或字典提取数据
  三、多线程数据抓取
  1.把要爬取的网址放入队列
  需要用到的模块有:from queue import Queue
  2.多线程从队列中取出地址并调用requests模块获取文件
  需要用到的模块有:from threading import Thread
  3.进行I/O读写时注意加锁
  需要用到的模块有:from threading import Lock
  4.调用队列URL地址的两种写法
  当队列值为空时,线程如果发出请求就会被阻塞,因此需要对队列做空操作或抛出异常。
  方法一:判断队列是否为空,避免线程阻塞
  虽然为真:
  如果不是 q.empty():
  url=q.get()
  其他:
  休息
  方法二:随时间抛出异常
  试试:
  url=q.get(block=True,timeout=5)
  ....
  例外为 e:
  休息
  5.多线程争夺公共文件时的操作
  多线程写文件时不加线程锁会导致一系列问题
  方法如下:
  从线程导入锁
  lock=Lock()
  lock.acquire() #加锁
  代码块
  local.relase() #release
  案例:
  Python多线程爬虫、腾讯作业网作业爬虫、Ajax异步数据爬取模板
  四、将爬虫数据存入数据库并存入缓存的思路
  此内容将在未来添加..
  五、Python 爬虫程序常用的解析模块
  Pythoy一般用来解析带有re、lxml+xpath、json的页面模块,下面是用法
  1.re
  re用正则表达式来得到你想要的东西,核心是正则表达式怎么写
  python正则表达式re模块介绍,贪婪匹配与非贪婪匹配,案例:猫眼电影TOP100信息抽取
  2.lxml+xpath
  lxml+xpath就是写xpath,然后用lxml解析xpath进行匹配,需要知道xpath的规则(教程):
  Python常用插件,lxml+Xpath实现爬虫,使用Xpath爬取链家二手房信息
  3.ajax/json
  JSON 一般是ajax动态数据。请求得到ajax响应内容后,会进行json化,然后进一步处理,比如存储在库中,存储在缓存中
  Python多线程爬虫、腾讯作业网作业爬取程序、Ajax异步数据爬取模板
  4.pyexecjs
  python爬虫程序的百度翻译,pyexecjs模块的使用(python中的js解析库)
  六、crawler 框架
  1.Selenium
  Selenium 不是严格意义上的框架。它不同于传统的爬虫。 Selenium 更像是一个模拟人类操作的机器人。简单的说,你打开一个网页,比如起点小说网站,里面有很多你想感兴趣的小说复制到本地。人为地做到这一点是不可能的。一部小说短则几百,长则数万。您可以一张一张地复制它。是否可以?这时候就可以写一个Selenium爬虫程序来模拟你的行为:打开网页,点击小说,打开第一章,复制第一章,关闭网页,打开第二章,复制第二章……直到最后一章。 Selenium就是在做这样的事情,而且这些操作都是可视化的(你可以看到它在做这个),这是和传统爬虫最大的区别。
  Selenium+ChromeDriver框架、Selenium介绍、百度搜索、猫眼电影、京东商城案例
  2.Scrapy 框架
  Scrapy 是目前最流行的 Python 框架。这个框架帮助我们做了很多前期工作,省去了重复写的麻烦。最重要的是为爬虫程序提供一个可行的框架,并且尽可能的去理解。耦合使团队编程成为可能。想做python爬虫,Scarpy一定要掌握。
  教程:
  Scrapy爬虫框架,入门案例(很详细),Scrapy多线程思路 查看全部

  python抓取动态网页(Python爬虫小程序,爬取百度贴吧网页文件,新手练手的好案例)
  内容
  本文文章帮助初学者理清网络爬虫的思路。 文章 的内容并不深奥。主要是通过案例帮助大家学习爬虫程序。学习了这些基础工具之后,你的爬虫之路才刚刚开始。 文章的内容来自我博客中关于python爬虫的章节。更多内容请参考我博客的网络爬虫专栏。特别提示:转载请注明出处。
  0、crawler 介绍
  在做任何事情之前,先弄清楚你为什么要这样做,以及如何去做。
  网络爬虫简介:网络爬虫的目的,企业获取数据的方式,可以作为爬虫的编程语言,以及爬虫爬取数据的步骤
  一、静态文件捕获(响应文件中存在的数据)
  大部分数据直接写在静态文件上。这里的静态文件通常是指在一定时间内不会发生变化且不需要与后台交互的网页。
  1. 首先确认响应文件中是否存在抓取到的数据
  2.分析页面结构,观察URL地址规律
  1)查看网页元素的布局,预览整体结构,并使用控制台进行分析
  2)检查浏览网页时元素结构是否发生变化(如翻页)
  3)检查页面重定向时URL地址是否发生变化(判断是否发生请求转发或重定向),如果有,去JS代码中查找变化原因
  3.开始编写数据捕获代码
  4. 开始编写我的第一个爬虫程序
  Python爬虫入门,最简单的爬虫代码,网站如何判断是人为操作还是爬虫程序操作,对url参数中的中文参数进行编码,一个基于百度搜索的爬虫程序
  完成上述案例后,可以再做一个案例来练手。 Python爬虫小程序,爬取百度贴吧网页文件,新手练习的好案例。
  5.多级页面爬取思路
  以上两种情况都是抓取一级页面。一级页面是指打开一个网页,只抓取网页上的内容,而二级页面是一级页面的基础,你点击一个内容,这个内容往往是一个链接,它带你到另一个页面,这是二级页面。在做爬虫的时候,我们一般都是先下载一级页面。这个页面没有我们要爬取的数据,但是收录了网站的链接,里面存放着我们要的数据。采集完所有的链接,我们就拥有了所有的二级页面,你也拥有了所有的数据。这时候就可以去二级页面爬取数据了。有二级页面和三级页面和四级页面,但原理是一样的。
  我们来看看如何抓取二级页面的内容。
  Python爬虫,4567电影网电影信息爬取,二次页面处理方案
  二、动态文件捕获(响应文件中不存在的数据)
  这部分的数据不是存储在响应内容中,而是存储在Ajax XML文件或JS文件中,并且随着你的操作动态变化。
  1.如果你发现你想要的内容已经不在响应文件中了,那很有可能是使用ajax动态生成的
  2.F12 进入控制台抓包,刷新页面或执行某些动作,查看XHR异步加载的数据包内容
  1)GET 请求:检查Request Headers请求头,检查请求头是怎么做的,是否需要伪装请求头。
  查看查询字符串参数,查看请求参数,这些参数大多收录在URL中
  2)Post 请求:检查Request Headers请求头,检查请求头是怎么做的,是否需要伪装请求头。
  查看FormData表单数据,看post请求发送时封装了哪些数据,这些数据哪些是动态的,哪些是静态的,以及如何生成动态进一步分析(主要通过JS代码分析)
  3. 观察Form的查询参数或数据模式。如果需要进一步抓取分析处理,应该分析JS文件
  4.使用 request.get().json() 获取json数据,使用列表或字典提取数据
  三、多线程数据抓取
  1.把要爬取的网址放入队列
  需要用到的模块有:from queue import Queue
  2.多线程从队列中取出地址并调用requests模块获取文件
  需要用到的模块有:from threading import Thread
  3.进行I/O读写时注意加锁
  需要用到的模块有:from threading import Lock
  4.调用队列URL地址的两种写法
  当队列值为空时,线程如果发出请求就会被阻塞,因此需要对队列做空操作或抛出异常。
  方法一:判断队列是否为空,避免线程阻塞
  虽然为真:
  如果不是 q.empty():
  url=q.get()
  其他:
  休息
  方法二:随时间抛出异常
  试试:
  url=q.get(block=True,timeout=5)
  ....
  例外为 e:
  休息
  5.多线程争夺公共文件时的操作
  多线程写文件时不加线程锁会导致一系列问题
  方法如下:
  从线程导入锁
  lock=Lock()
  lock.acquire() #加锁
  代码块
  local.relase() #release
  案例:
  Python多线程爬虫、腾讯作业网作业爬虫、Ajax异步数据爬取模板
  四、将爬虫数据存入数据库并存入缓存的思路
  此内容将在未来添加..
  五、Python 爬虫程序常用的解析模块
  Pythoy一般用来解析带有re、lxml+xpath、json的页面模块,下面是用法
  1.re
  re用正则表达式来得到你想要的东西,核心是正则表达式怎么写
  python正则表达式re模块介绍,贪婪匹配与非贪婪匹配,案例:猫眼电影TOP100信息抽取
  2.lxml+xpath
  lxml+xpath就是写xpath,然后用lxml解析xpath进行匹配,需要知道xpath的规则(教程):
  Python常用插件,lxml+Xpath实现爬虫,使用Xpath爬取链家二手房信息
  3.ajax/json
  JSON 一般是ajax动态数据。请求得到ajax响应内容后,会进行json化,然后进一步处理,比如存储在库中,存储在缓存中
  Python多线程爬虫、腾讯作业网作业爬取程序、Ajax异步数据爬取模板
  4.pyexecjs
  python爬虫程序的百度翻译,pyexecjs模块的使用(python中的js解析库)
  六、crawler 框架
  1.Selenium
  Selenium 不是严格意义上的框架。它不同于传统的爬虫。 Selenium 更像是一个模拟人类操作的机器人。简单的说,你打开一个网页,比如起点小说网站,里面有很多你想感兴趣的小说复制到本地。人为地做到这一点是不可能的。一部小说短则几百,长则数万。您可以一张一张地复制它。是否可以?这时候就可以写一个Selenium爬虫程序来模拟你的行为:打开网页,点击小说,打开第一章,复制第一章,关闭网页,打开第二章,复制第二章……直到最后一章。 Selenium就是在做这样的事情,而且这些操作都是可视化的(你可以看到它在做这个),这是和传统爬虫最大的区别。
  Selenium+ChromeDriver框架、Selenium介绍、百度搜索、猫眼电影、京东商城案例
  2.Scrapy 框架
  Scrapy 是目前最流行的 Python 框架。这个框架帮助我们做了很多前期工作,省去了重复写的麻烦。最重要的是为爬虫程序提供一个可行的框架,并且尽可能的去理解。耦合使团队编程成为可能。想做python爬虫,Scarpy一定要掌握。
  教程:
  Scrapy爬虫框架,入门案例(很详细),Scrapy多线程思路

python抓取动态网页(快速入门:网页更新中的不同和XML的方式优点)

网站优化优采云 发表了文章 • 0 个评论 • 75 次浏览 • 2021-09-12 16:17 • 来自相关话题

  python抓取动态网页(快速入门:网页更新中的不同和XML的方式优点)
  动态网页数据获取 什么是 AJAX:
  AJAX(Asynchronouse JavaScript And XML)异步 JavaScript 和 XML。通过在后台与服务器交换少量数据,Ajax 可以使网页异步更新。这意味着可以在不重新加载整个网页的情况下更新网页的某些部分。如果内容需要更新,传统网页(不使用 Ajax)必须重新加载整个网页。因为传统的数据传输格式是XML语法。所以它被称为 AJAX。其实现在数据交互基本都是用JSON。使用AJAX加载的数据,即使使用JS将数据渲染到浏览器中,右击->查看网页源码也看不到ajax加载的数据,只能看到使用这个加载的html代码网址。
  ajax数据的获取方式:直接分析ajax调用的接口。然后通过代码请求这个接口。使用Selenium+chromedriver模拟浏览器行为获取数据。该方法的优缺点
  分析界面
  可以直接请求数据。无需做一些解析工作。代码量小,性能高。
  分析接口比较复杂,尤其是一些被js混淆的接口,必须有一定的js基础。很容易被发现是爬虫。
  硒
  直接模拟浏览器的行为。浏览器可以请求的内容也可以使用 selenium 请求。爬虫更稳定。
  大量代码。低性能。
  Selenium+chromedriver 获取动态数据:
  Selenium 相当于一个机器人。可以在浏览器上模拟人类的一些行为,在浏览器上自动处理一些行为,比如点击、填充数据、删除cookies等。 chromedriver是一个驱动Chrome浏览器的驱动,可以用来驱动浏览器当然,不同的浏览器有不同的驱动程序。下面列出了不同的浏览器及其相应的驱动程序:
  Chrome:安装Selenium和chromedriver:安装Selenium:Selenium有多种语言版本,如java、ruby、python等,我们可以下载python版本。
   pip3 install selenium
  安装chromedriver:下载完成后,放在一个不需要权限的纯英文目录下。快速入门:
  现在以获取百度首页的简单例子来谈谈如何快速上手Selenium和chromedriver:
  from selenium import webdriver
# chromedriver的绝对路径
driver_path = r&#39;D:\ProgramApp\chromedriver\chromedriver.exe&#39;
# 初始化一个driver,并且指定chromedriver的路径
driver = webdriver.Chrome(executable_path=driver_path)
# 请求网页
driver.get("https://www.baidu.com/")
# 通过page_source获取网页源代码
print(driver.page_source)
  Selenium 常见操作:
  更多教程请参考:
  关闭页面: driver.close():关闭当前页面。 driver.quit():退出整个浏览器。定位元素: find_element_by_id:根据id查找元素。相当于:
   submitTag = driver.find_element_by_id(&#39;su&#39;)
submitTag1 = driver.find_element(By.ID,&#39;su&#39;)
  find_element_by_class_name:根据类名查找元素。相当于:
   submitTag = driver.find_element_by_class_name(&#39;su&#39;)
submitTag1 = driver.find_element(By.CLASS_NAME,&#39;su&#39;)
  find_element_by_name:根据name属性的值查找元素。相当于:
   submitTag = driver.find_element_by_name(&#39;email&#39;)
submitTag1 = driver.find_element(By.NAME,&#39;email&#39;)
  find_element_by_tag_name:根据标签名称查找元素。相当于:
  submitTag = driver.find_element_by_tag_name(&#39;div&#39;)
submitTag1 = driver.find_element(By.TAG_NAME,&#39;div&#39;)
  find_element_by_xpath:根据 xpath 语法获取元素。相当于:
   submitTag = driver.find_element_by_xpath(&#39;//div&#39;)
submitTag1 = driver.find_element(By.XPATH,&#39;//div&#39;)
  find_element_by_css_selector:根据css选择器选择元素。相当于:
   submitTag = driver.find_element_by_css_selector(&#39;//div&#39;)
submitTag1 = driver.find_element(By.CSS_SELECTOR,&#39;//div&#39;)
  注意 find_element 是获取第一个满足条件的元素。 find_elements 是获取所有满足条件的元素。
  操作表单元素:
  操作输入框:分为两步。第一步:找到这个元素。第二步:使用send_keys(value)填写数据。示例代码如下:
   inputTag = driver.find_element_by_id(&#39;kw&#39;)
inputTag.send_keys(&#39;python&#39;)
  使用clear方法清除输入框中的内容。示例代码如下:
   inputTag.clear()
  操作checkbox:因为要选中checkbox标签,可以在网页上用鼠标点击。因此,如果要选中复选框标签,请先选中此标签,然后再执行点击事件。示例代码如下:
   rememberTag = driver.find_element_by_name("rememberMe")
rememberTag.click()
  Select select:不能直接点击select元素。因为元素需要点击后被选中。这时候,selenium 专门为 select 标签提供了一个类 selenium.webdriver.support.ui.Select。将获取的元素作为参数传递给该类以创建该对象。您可以在将来使用此对象进行选择。示例代码如下:
   from selenium.webdriver.support.ui import Select
# 选中这个标签,然后使用Select创建对象
selectTag = Select(driver.find_element_by_name("jumpMenu"))
# 根据索引选择
selectTag.select_by_index(1)
# 根据值选择
selectTag.select_by_value("http://www.95yueba.com")
# 根据可视的文本选择
selectTag.select_by_visible_text("95秀客户端")
# 取消选中所有选项
selectTag.deselect_all()
  操作按钮:操作按钮的方法有很多种。比如单击、右键、双击等,这里是最常用的一种。只需点击。直接调用click函数就行了。示例代码如下:
   inputTag = driver.find_element_by_id(&#39;su&#39;)
inputTag.click()
  行为链:
  有时候页面上的操作可能会有很多步骤,那么这次可以使用鼠标行为链类ActionChains来完成。例如,现在您想将鼠标移动到一个元素并执行一个点击事件。那么示例代码如下:
  inputTag = driver.find_element_by_id(&#39;kw&#39;)
submitTag = driver.find_element_by_id(&#39;su&#39;)
actions = ActionChains(driver)
actions.move_to_element(inputTag)
actions.send_keys_to_element(inputTag,&#39;python&#39;)
actions.move_to_element(submitTag)
actions.click(submitTag)
actions.perform()
  鼠标相关的操作较多。
  Cookie 操作:获取所有 Cookie:
   for cookie in driver.get_cookies():
print(cookie)
  根据cookie的key获取value:
   value = driver.get_cookie(key)
  删除所有 cookie:
   driver.delete_all_cookies()
  删除cookie:
   driver.delete_cookie(key)
  页面等待:
  如今,越来越多的网页使用 Ajax 技术,因此程序无法确定某个元素何时完全加载。如果实际页面等待时间过长,某个dom元素没有出来,而你的代码直接使用了这个WebElement,那么就会抛出NullPointer异常。为了解决这个问题。所以Selenium提供了两种等待方式:一种是隐式等待,另一种是显式等待。
  隐式等待:调用 driver.implicitly_wait。然后,在获取不可用元素之前,它会等待 10 秒。示例代码如下:
  driver = webdriver.Chrome(executable_path=driver_path)
driver.implicitly_wait(10)
# 请求网页
driver.get("https://www.douban.com/")
  显示等待:显示等待是表示在执行获取元素的操作之前已经建立了某种条件。也可以指定等待的最长时间,超过这个时间就会抛出异常。显示等待应在 selenium.webdriver.support.excepted_conditions 和 selenium.webdriver.support.ui.WebDriverWait 的预期条件下完成。示例代码如下:
   from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit() from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
  其他一些等待条件:
  切换页面:
  有时窗口中有很多子标签页。这个时候必须切换。 Selenium 提供了一个 switch_to_window 来切换。要切换到的特定页面可以在 driver.window_handles 中找到。示例代码如下:
  # 打开一个新的页面
self.driver.execute_script("window.open(&#39;"+url+"&#39;)")
# 切换到这个新的页面中
self.driver.switch_to_window(self.driver.window_handles[1])
  设置代理ip:
  有些网页有时会被频繁抓取。服务器发现你是爬虫后会屏蔽你的ip地址。这时候我们就可以更改代理ip了。更改代理ip,不同浏览器实现方式不同。下面以Chrome浏览器为例进行说明:
  from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://110.73.2.248:8123")
driver_path = r"D:\ProgramApp\chromedriver\chromedriver.exe"
driver = webdriver.Chrome(executable_path=driver_path,chrome_options=options)
driver.get(&#39;http://httpbin.org/ip&#39;)
  WebElement 元素:
  from selenium.webdriver.remote.webelement import WebElement 类是获取的每个元素的类。
  有一些常用的属性:
  get_attribute:此标签的属性值。 screentshot:获取当前页面的截图。此方法只能在驱动上使用。
  driver 的对象类也是继承自 WebElement。
  更多内容请阅读相关源码。
  转载于: 查看全部

  python抓取动态网页(快速入门:网页更新中的不同和XML的方式优点)
  动态网页数据获取 什么是 AJAX:
  AJAX(Asynchronouse JavaScript And XML)异步 JavaScript 和 XML。通过在后台与服务器交换少量数据,Ajax 可以使网页异步更新。这意味着可以在不重新加载整个网页的情况下更新网页的某些部分。如果内容需要更新,传统网页(不使用 Ajax)必须重新加载整个网页。因为传统的数据传输格式是XML语法。所以它被称为 AJAX。其实现在数据交互基本都是用JSON。使用AJAX加载的数据,即使使用JS将数据渲染到浏览器中,右击->查看网页源码也看不到ajax加载的数据,只能看到使用这个加载的html代码网址。
  ajax数据的获取方式:直接分析ajax调用的接口。然后通过代码请求这个接口。使用Selenium+chromedriver模拟浏览器行为获取数据。该方法的优缺点
  分析界面
  可以直接请求数据。无需做一些解析工作。代码量小,性能高。
  分析接口比较复杂,尤其是一些被js混淆的接口,必须有一定的js基础。很容易被发现是爬虫。
  硒
  直接模拟浏览器的行为。浏览器可以请求的内容也可以使用 selenium 请求。爬虫更稳定。
  大量代码。低性能。
  Selenium+chromedriver 获取动态数据:
  Selenium 相当于一个机器人。可以在浏览器上模拟人类的一些行为,在浏览器上自动处理一些行为,比如点击、填充数据、删除cookies等。 chromedriver是一个驱动Chrome浏览器的驱动,可以用来驱动浏览器当然,不同的浏览器有不同的驱动程序。下面列出了不同的浏览器及其相应的驱动程序:
  Chrome:安装Selenium和chromedriver:安装Selenium:Selenium有多种语言版本,如java、ruby、python等,我们可以下载python版本。
   pip3 install selenium
  安装chromedriver:下载完成后,放在一个不需要权限的纯英文目录下。快速入门:
  现在以获取百度首页的简单例子来谈谈如何快速上手Selenium和chromedriver:
  from selenium import webdriver
# chromedriver的绝对路径
driver_path = r&#39;D:\ProgramApp\chromedriver\chromedriver.exe&#39;
# 初始化一个driver,并且指定chromedriver的路径
driver = webdriver.Chrome(executable_path=driver_path)
# 请求网页
driver.get("https://www.baidu.com/";)
# 通过page_source获取网页源代码
print(driver.page_source)
  Selenium 常见操作:
  更多教程请参考:
  关闭页面: driver.close():关闭当前页面。 driver.quit():退出整个浏览器。定位元素: find_element_by_id:根据id查找元素。相当于:
   submitTag = driver.find_element_by_id(&#39;su&#39;)
submitTag1 = driver.find_element(By.ID,&#39;su&#39;)
  find_element_by_class_name:根据类名查找元素。相当于:
   submitTag = driver.find_element_by_class_name(&#39;su&#39;)
submitTag1 = driver.find_element(By.CLASS_NAME,&#39;su&#39;)
  find_element_by_name:根据name属性的值查找元素。相当于:
   submitTag = driver.find_element_by_name(&#39;email&#39;)
submitTag1 = driver.find_element(By.NAME,&#39;email&#39;)
  find_element_by_tag_name:根据标签名称查找元素。相当于:
  submitTag = driver.find_element_by_tag_name(&#39;div&#39;)
submitTag1 = driver.find_element(By.TAG_NAME,&#39;div&#39;)
  find_element_by_xpath:根据 xpath 语法获取元素。相当于:
   submitTag = driver.find_element_by_xpath(&#39;//div&#39;)
submitTag1 = driver.find_element(By.XPATH,&#39;//div&#39;)
  find_element_by_css_selector:根据css选择器选择元素。相当于:
   submitTag = driver.find_element_by_css_selector(&#39;//div&#39;)
submitTag1 = driver.find_element(By.CSS_SELECTOR,&#39;//div&#39;)
  注意 find_element 是获取第一个满足条件的元素。 find_elements 是获取所有满足条件的元素。
  操作表单元素:
  操作输入框:分为两步。第一步:找到这个元素。第二步:使用send_keys(value)填写数据。示例代码如下:
   inputTag = driver.find_element_by_id(&#39;kw&#39;)
inputTag.send_keys(&#39;python&#39;)
  使用clear方法清除输入框中的内容。示例代码如下:
   inputTag.clear()
  操作checkbox:因为要选中checkbox标签,可以在网页上用鼠标点击。因此,如果要选中复选框标签,请先选中此标签,然后再执行点击事件。示例代码如下:
   rememberTag = driver.find_element_by_name("rememberMe")
rememberTag.click()
  Select select:不能直接点击select元素。因为元素需要点击后被选中。这时候,selenium 专门为 select 标签提供了一个类 selenium.webdriver.support.ui.Select。将获取的元素作为参数传递给该类以创建该对象。您可以在将来使用此对象进行选择。示例代码如下:
   from selenium.webdriver.support.ui import Select
# 选中这个标签,然后使用Select创建对象
selectTag = Select(driver.find_element_by_name("jumpMenu"))
# 根据索引选择
selectTag.select_by_index(1)
# 根据值选择
selectTag.select_by_value("http://www.95yueba.com";)
# 根据可视的文本选择
selectTag.select_by_visible_text("95秀客户端")
# 取消选中所有选项
selectTag.deselect_all()
  操作按钮:操作按钮的方法有很多种。比如单击、右键、双击等,这里是最常用的一种。只需点击。直接调用click函数就行了。示例代码如下:
   inputTag = driver.find_element_by_id(&#39;su&#39;)
inputTag.click()
  行为链:
  有时候页面上的操作可能会有很多步骤,那么这次可以使用鼠标行为链类ActionChains来完成。例如,现在您想将鼠标移动到一个元素并执行一个点击事件。那么示例代码如下:
  inputTag = driver.find_element_by_id(&#39;kw&#39;)
submitTag = driver.find_element_by_id(&#39;su&#39;)
actions = ActionChains(driver)
actions.move_to_element(inputTag)
actions.send_keys_to_element(inputTag,&#39;python&#39;)
actions.move_to_element(submitTag)
actions.click(submitTag)
actions.perform()
  鼠标相关的操作较多。
  Cookie 操作:获取所有 Cookie:
   for cookie in driver.get_cookies():
print(cookie)
  根据cookie的key获取value:
   value = driver.get_cookie(key)
  删除所有 cookie:
   driver.delete_all_cookies()
  删除cookie:
   driver.delete_cookie(key)
  页面等待:
  如今,越来越多的网页使用 Ajax 技术,因此程序无法确定某个元素何时完全加载。如果实际页面等待时间过长,某个dom元素没有出来,而你的代码直接使用了这个WebElement,那么就会抛出NullPointer异常。为了解决这个问题。所以Selenium提供了两种等待方式:一种是隐式等待,另一种是显式等待。
  隐式等待:调用 driver.implicitly_wait。然后,在获取不可用元素之前,它会等待 10 秒。示例代码如下:
  driver = webdriver.Chrome(executable_path=driver_path)
driver.implicitly_wait(10)
# 请求网页
driver.get("https://www.douban.com/";)
  显示等待:显示等待是表示在执行获取元素的操作之前已经建立了某种条件。也可以指定等待的最长时间,超过这个时间就会抛出异常。显示等待应在 selenium.webdriver.support.excepted_conditions 和 selenium.webdriver.support.ui.WebDriverWait 的预期条件下完成。示例代码如下:
   from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading";)
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit() from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading";)
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
  其他一些等待条件:
  切换页面:
  有时窗口中有很多子标签页。这个时候必须切换。 Selenium 提供了一个 switch_to_window 来切换。要切换到的特定页面可以在 driver.window_handles 中找到。示例代码如下:
  # 打开一个新的页面
self.driver.execute_script("window.open(&#39;"+url+"&#39;)")
# 切换到这个新的页面中
self.driver.switch_to_window(self.driver.window_handles[1])
  设置代理ip:
  有些网页有时会被频繁抓取。服务器发现你是爬虫后会屏蔽你的ip地址。这时候我们就可以更改代理ip了。更改代理ip,不同浏览器实现方式不同。下面以Chrome浏览器为例进行说明:
  from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://110.73.2.248:8123";)
driver_path = r"D:\ProgramApp\chromedriver\chromedriver.exe"
driver = webdriver.Chrome(executable_path=driver_path,chrome_options=options)
driver.get(&#39;http://httpbin.org/ip&#39;)
  WebElement 元素:
  from selenium.webdriver.remote.webelement import WebElement 类是获取的每个元素的类。
  有一些常用的属性:
  get_attribute:此标签的属性值。 screentshot:获取当前页面的截图。此方法只能在驱动上使用。
  driver 的对象类也是继承自 WebElement。
  更多内容请阅读相关源码。
  转载于:

python抓取动态网页(使用selenium.webdriver登录Facebook并获取公众人物的HTML页面)

网站优化优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2021-09-12 05:12 • 来自相关话题

  python抓取动态网页(使用selenium.webdriver登录Facebook并获取公众人物的HTML页面)
  使用 selenium.webdriver 登录 Facebook 并获取公众人物的 HTML 页面(例如),您可能需要从该页面抓取已发布的内容。 python如何获取网页的所有内容动态
<p>我发现使用 selemium.webdriver 时,我只能获取当前屏幕中网页的内容。例如,当我登录Facebook并想获取所有网页内容时,我得到的只是当前屏幕中稍后的几个,但实际上页面上有很多帖子(内容)。 查看全部

  python抓取动态网页(使用selenium.webdriver登录Facebook并获取公众人物的HTML页面)
  使用 selenium.webdriver 登录 Facebook 并获取公众人物的 HTML 页面(例如),您可能需要从该页面抓取已发布的内容。 python如何获取网页的所有内容动态
<p>我发现使用 selemium.webdriver 时,我只能获取当前屏幕中网页的内容。例如,当我登录Facebook并想获取所有网页内容时,我得到的只是当前屏幕中稍后的几个,但实际上页面上有很多帖子(内容)。

python抓取动态网页( 五一假期Python抓取动态网页信息的相关操作、网上教程编写出)

网站优化优采云 发表了文章 • 0 个评论 • 104 次浏览 • 2021-09-12 05:11 • 来自相关话题

  python抓取动态网页(
五一假期Python抓取动态网页信息的相关操作、网上教程编写出)
  
  5月1日放假学习Python爬取动态网页信息的相关操作,结合封面上的参考书和网上教程写出能满足需求的代码。从我第一次接触python开始,过程就经历了很多波折。为避免日后出现问题,暂时找不到相关资料来创建本文。
  准备工具:
  Python 3.8Google Chrome 浏览器 Googledriver
  测试网站:
  1.集思录(#cb)
  考前准备:
  1.配置python运行的环境变量,参考链接()
  *本次测试主要使用两种方式抓取动态网页数据,一种是requests和json解析;另一种是硒。 requests 方法速度快,但有些元素的链接信息无法捕获; selenium 方法通过模拟打开浏览器来捕获数据。速度比较慢,因为需要打开浏览器,但是可以爬取的信息比较慢。综合。
  抓取的主要内容如下:(网站部分可转债数据)
  
  通过请求获取网站信息:
  Python需要安装的相关脚本:Requests
  安装方法:以管理员身份运行cmd;输入pip install requests命令,安装成功后会有提示。一次装不下,多装几次。
  (前提是相关端口没有关闭)。如果pip版本不是最新的,会提醒你更新pip版本,pip的环境变量也要设置好。设置方法参考python的设置方法。
  请求获取代码如下:
  import requests
import json
url='https://www.jisilu.cn/data/cbnew/cb_list/?___jsl=LST___'
return_data = requests.get(url,verify = False)
js=return_data.json()
for i in js['rows']:
print(i['id']+" "+i['cell']['bond_nm']+" "+i['cell']['price'])
  最终结果如下:
  
  注意两点:
  找到正确的url:chrome打开头脑风暴记录网站(#cb)。点击F12按钮,在弹出的开发工具窗口中选择network,然后选择XHR,点击F5刷新。在名称栏中一一点击,找到您需要的XHR。通过预览可以发现“?__jsl=LST”对应的XHR就是我们要找的,在headers中可以找到对应的url。
  
  json 对请求的数据格式进行转换,方便数据查找。 json格式转换后,请求的数据格式与预览的格式一致。如果要定位到“国轩转债”一栏的数据,使用代码js['rows']['cell']['bond_nm']*selenium抓取网页数据:
  python需要安装的脚本:selenium(安装方法参考requests installation)
  配置浏览器对应的webdriver。以chrome为例,下载chrome版本对应的驱动(地址栏输入chrome://version,回车查看chrome版本)。放在chrome安装的文件夹下,设置环境变量。
  Selenium 爬取代码如下:
  from selenium import webdriver
import time
driver=webdriver.Chrome()
url1='https://www.jisilu.cn/data/cbnew/#cb'
bes=driver.get(url1)
time.sleep(5) #增加延时命令,等待元素加载
driver.find_element_by_tag_name("tr").click() #增加延时,等待元素加载
table_tr_list=driver.find_element_by_xpath("//*[@id='flex_cb']").find_elements_by_tag_name("tr") #后面一个element改成elements
for tr in table_tr_list:
if len(tr.get_attribute('id'))>0:
print(tr.find_element_by_xpath("//*[@id=%d]/td[1]/a"%(int(tr.get_attribute('id')))).text+" "+tr.find_element_by_xpath("//*[@id=%d]/td[2]"%(int(tr.get_attribute('id')))).text)
driver.quit()
  运行结果如下:
  
  注意三点:
  1、 应该添加一个延迟命令(time.sleep(5)),否则可能会出现找不到元素的错误(NoSuchElementException)
  2、使用find_element_by_xpath时,可以在web开发者中右键复制xpath,确认元素的路径。
  
  3、发送ID时,将字符转为数值,注意清除空字符
  捕获的数据也可以通过python保存在excel中。 查看全部

  python抓取动态网页(
五一假期Python抓取动态网页信息的相关操作、网上教程编写出)
  
  5月1日放假学习Python爬取动态网页信息的相关操作,结合封面上的参考书和网上教程写出能满足需求的代码。从我第一次接触python开始,过程就经历了很多波折。为避免日后出现问题,暂时找不到相关资料来创建本文。
  准备工具:
  Python 3.8Google Chrome 浏览器 Googledriver
  测试网站:
  1.集思录(#cb)
  考前准备:
  1.配置python运行的环境变量,参考链接()
  *本次测试主要使用两种方式抓取动态网页数据,一种是requests和json解析;另一种是硒。 requests 方法速度快,但有些元素的链接信息无法捕获; selenium 方法通过模拟打开浏览器来捕获数据。速度比较慢,因为需要打开浏览器,但是可以爬取的信息比较慢。综合。
  抓取的主要内容如下:(网站部分可转债数据)
  
  通过请求获取网站信息:
  Python需要安装的相关脚本:Requests
  安装方法:以管理员身份运行cmd;输入pip install requests命令,安装成功后会有提示。一次装不下,多装几次。
  (前提是相关端口没有关闭)。如果pip版本不是最新的,会提醒你更新pip版本,pip的环境变量也要设置好。设置方法参考python的设置方法。
  请求获取代码如下:
  import requests
import json
url='https://www.jisilu.cn/data/cbnew/cb_list/?___jsl=LST___'
return_data = requests.get(url,verify = False)
js=return_data.json()
for i in js['rows']:
print(i['id']+" "+i['cell']['bond_nm']+" "+i['cell']['price'])
  最终结果如下:
  
  注意两点:
  找到正确的url:chrome打开头脑风暴记录网站(#cb)。点击F12按钮,在弹出的开发工具窗口中选择network,然后选择XHR,点击F5刷新。在名称栏中一一点击,找到您需要的XHR。通过预览可以发现“?__jsl=LST”对应的XHR就是我们要找的,在headers中可以找到对应的url。
  
  json 对请求的数据格式进行转换,方便数据查找。 json格式转换后,请求的数据格式与预览的格式一致。如果要定位到“国轩转债”一栏的数据,使用代码js['rows']['cell']['bond_nm']*selenium抓取网页数据:
  python需要安装的脚本:selenium(安装方法参考requests installation)
  配置浏览器对应的webdriver。以chrome为例,下载chrome版本对应的驱动(地址栏输入chrome://version,回车查看chrome版本)。放在chrome安装的文件夹下,设置环境变量。
  Selenium 爬取代码如下:
  from selenium import webdriver
import time
driver=webdriver.Chrome()
url1='https://www.jisilu.cn/data/cbnew/#cb'
bes=driver.get(url1)
time.sleep(5) #增加延时命令,等待元素加载
driver.find_element_by_tag_name("tr").click() #增加延时,等待元素加载
table_tr_list=driver.find_element_by_xpath("//*[@id='flex_cb']").find_elements_by_tag_name("tr") #后面一个element改成elements
for tr in table_tr_list:
if len(tr.get_attribute('id'))>0:
print(tr.find_element_by_xpath("//*[@id=%d]/td[1]/a"%(int(tr.get_attribute('id')))).text+" "+tr.find_element_by_xpath("//*[@id=%d]/td[2]"%(int(tr.get_attribute('id')))).text)
driver.quit()
  运行结果如下:
  
  注意三点:
  1、 应该添加一个延迟命令(time.sleep(5)),否则可能会出现找不到元素的错误(NoSuchElementException)
  2、使用find_element_by_xpath时,可以在web开发者中右键复制xpath,确认元素的路径。
  
  3、发送ID时,将字符转为数值,注意清除空字符
  捕获的数据也可以通过python保存在excel中。

python抓取动态网页(.4win7框架:如何获取网页上动态加载的数据)

网站优化优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2021-09-12 05:11 • 来自相关话题

  python抓取动态网页(.4win7框架:如何获取网页上动态加载的数据)
  环境:python3.4
  win7
  框架:scrapy
  接上一篇,这次讲一下如何获取网页上动态加载的数据:
  作为初学者,我们在第一次接触爬虫的时候,一般只会抓取一些静态内容(如何区分静态内容和动态内容,这里不讲理论,教的是一些小方法):
  首先打开谷歌浏览器,然后按F12,就会弹出谷歌内置的开发者工具,先在“元素”下找到你需要抓取的内容;
  然后,在网页可视化界面右击,选择查看网页源代码。这个网页源码就是我们按照抓取静态网页的方法在这个网页上能看到的所有东西,而开发者工具可以看到一些我们在网页源码中看不到的东西;
  最后,通过对比我们在F12中查看的内容和网页源代码中的内容,我们可以初步判断哪些数据是静态加载的,哪些数据是动态加载的。
  ———————————————分割线————————————
  一般的请求方法有两种,post请求方法和get请求方法。这篇文章,我们先说说get请求方法。
  说到get请求,这应该是最常用的请求之一。表达 get 请求的最直观方式是什么?其实我们把网址放在地址栏中打开网页,这是一个get请求。
  ———————————————分割线————————————
  好的,现在我们进入正题:我们先通过一个例子来谈谈。当我们抓取一个大型购物网站的产品评论时:
  
  当我们点击1或2 3 4时,我们会发现网址根本没有变化。这意味着这些注释是动态加载的。然后我们将使用F12下的抓包工具来尝试捕获它们。 :(F12,然后选择“网络”),出现下图:
  
  接下来是最重要的:在可视化界面中,我们点击“2”按钮,让评论页面跳转到第二页,看能否顺利抓包:
  
  好的,可以看到有2个gif文件,2个png文件,还有一个脚本文件。一开始,我们不知道要检查哪个文件。好吧,最笨的办法,一一点击。 : 所以我都下单了,除了脚本文件,其他都是这样的:
  
  哈哈,就算没有,那我们也只能检查这个脚本文件了。看Response,发现只是一堆代码,查起来好像不方便?好的,没问题,我们试试预览,效果会很好。 . . 我发现结果很高兴听到:
  
  你看到了吗!评论评论,大家应该相信网站大佬的英文是绝对没问题的,不会像我一样给评论起个“pinglun”的!
  然后点击这条评论看看里面有什么:
  
  好的,就是我们想要的评论,所以这个文件所在的URL就是我们需要的,然后我们通过查看Headers来获取URL!
  
  URL是我们需要的网址(网址被马赛克抹掉了,对不起大家,因为我哥也怕被查水表),状态值为200表示访问成功,访问方法:GET,回显话题,使用get请求获取网页的动态加载数据。好了,今天的教程到此结束。什么?不构造一个获取请求?那请到我的第一篇博文找大神的爬虫教程链接~~~~
  好了,本文到此结束。我从头到尾都没有看到任何代码。哈哈,有时候教他们钓鱼不如教他们钓鱼。代码很重要,方法也很重要。有了这些分析方法,相信大家都能快速掌握获取动态网页内容的技巧。下一篇我们会讲如何使用post请求来获取网页的动态加载数据~我们下期再见 查看全部

  python抓取动态网页(.4win7框架:如何获取网页上动态加载的数据)
  环境:python3.4
  win7
  框架:scrapy
  接上一篇,这次讲一下如何获取网页上动态加载的数据:
  作为初学者,我们在第一次接触爬虫的时候,一般只会抓取一些静态内容(如何区分静态内容和动态内容,这里不讲理论,教的是一些小方法):
  首先打开谷歌浏览器,然后按F12,就会弹出谷歌内置的开发者工具,先在“元素”下找到你需要抓取的内容;
  然后,在网页可视化界面右击,选择查看网页源代码。这个网页源码就是我们按照抓取静态网页的方法在这个网页上能看到的所有东西,而开发者工具可以看到一些我们在网页源码中看不到的东西;
  最后,通过对比我们在F12中查看的内容和网页源代码中的内容,我们可以初步判断哪些数据是静态加载的,哪些数据是动态加载的。
  ———————————————分割线————————————
  一般的请求方法有两种,post请求方法和get请求方法。这篇文章,我们先说说get请求方法。
  说到get请求,这应该是最常用的请求之一。表达 get 请求的最直观方式是什么?其实我们把网址放在地址栏中打开网页,这是一个get请求。
  ———————————————分割线————————————
  好的,现在我们进入正题:我们先通过一个例子来谈谈。当我们抓取一个大型购物网站的产品评论时:
  
  当我们点击1或2 3 4时,我们会发现网址根本没有变化。这意味着这些注释是动态加载的。然后我们将使用F12下的抓包工具来尝试捕获它们。 :(F12,然后选择“网络”),出现下图:
  
  接下来是最重要的:在可视化界面中,我们点击“2”按钮,让评论页面跳转到第二页,看能否顺利抓包:
  
  好的,可以看到有2个gif文件,2个png文件,还有一个脚本文件。一开始,我们不知道要检查哪个文件。好吧,最笨的办法,一一点击。 : 所以我都下单了,除了脚本文件,其他都是这样的:
  
  哈哈,就算没有,那我们也只能检查这个脚本文件了。看Response,发现只是一堆代码,查起来好像不方便?好的,没问题,我们试试预览,效果会很好。 . . 我发现结果很高兴听到:
  
  你看到了吗!评论评论,大家应该相信网站大佬的英文是绝对没问题的,不会像我一样给评论起个“pinglun”的!
  然后点击这条评论看看里面有什么:
  
  好的,就是我们想要的评论,所以这个文件所在的URL就是我们需要的,然后我们通过查看Headers来获取URL!
  
  URL是我们需要的网址(网址被马赛克抹掉了,对不起大家,因为我哥也怕被查水表),状态值为200表示访问成功,访问方法:GET,回显话题,使用get请求获取网页的动态加载数据。好了,今天的教程到此结束。什么?不构造一个获取请求?那请到我的第一篇博文找大神的爬虫教程链接~~~~
  好了,本文到此结束。我从头到尾都没有看到任何代码。哈哈,有时候教他们钓鱼不如教他们钓鱼。代码很重要,方法也很重要。有了这些分析方法,相信大家都能快速掌握获取动态网页内容的技巧。下一篇我们会讲如何使用post请求来获取网页的动态加载数据~我们下期再见

python抓取动态网页( 爬取猫眼电影的应用技巧和基本知识点的抓取教程)

网站优化优采云 发表了文章 • 0 个评论 • 58 次浏览 • 2021-09-11 19:16 • 来自相关话题

  python抓取动态网页(
爬取猫眼电影的应用技巧和基本知识点的抓取教程)
  python 网络爬虫(动态网页)
  时间:2021-08-08
  本文章向大家介绍python网络爬虫(动态网页),主要包括python网络爬虫(动态网页)用例、应用技巧、基础知识点总结和注意事项。有一定的参考价值,是需要的。朋友们可以参考一下。
  内容
  抓取动态网页
  新手开始学习爬虫,一般是从爬豆瓣开始。学会了爬豆瓣后,本来想爬其他网页玩的,后来就选择爬猫眼电影了。和豆瓣一样,我们进入猫眼电影,查看源码,可以看到很多我们想要的,但是用requests解析后,里面什么都没有。一开始还以为自己看错了,后来问了别人才知道,这是一个需要浏览器浏览的动态网页,或者是移动鼠标后才生成HTML代码。因此,为了能够顺便抓取到我们需要的信息,我们需要使用工具来模仿用户行为来生成HTML代码。
  分析网站
  解析网站时,使用requests库进行访问,也可以使用Xpath或BeautifulSoup进行解析。
  import requests
import lxml
from bs4 import BeautifulSoup
  def get_one_page(url):
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'}
response=requests.get(url,headers=headers)
soup = BeautifulSoup(response.text,'html.parser')
titles = soup.find_all('title')
print(titles)
# if response.status_code==200:# 状态响应码为200 表示正常访问
# return response.text
# return None

def main():
url='https://maoyan.com/board/4?offset=0'
html=get_one_page(url)
# print(html)

main()
  分析以上代码,发现没有我们需要的内容
  显示最后一个
  什么都解析不了,应该是用Javascript动态生成信息,所以我也学了动态Javascript抓取教程。
  在 Python 中使用 Selenium 执行 JavaScript
  Selenium 是一个强大的网页抓取工具,最初是为网站automated 测试而开发的。 Selenium 可以让浏览器自动加载网站,获取需要的数据,甚至可以对网页进行截图,或者判断网站上是否发生了某些操作。
  安装 iSelenium
  首先安装 Selenium
  pip install Selenium
  下载 PhantomJS
  安装完成后,我们还需要安装PhantomJS。因为是全功能浏览器,不是python库,所以不能用pip安装
  浏览器输入
  根据需要自行下载,下载后解压,将解压包内的bin文件夹添加到环境变量中
  driver = webdriver.PhantomJS(executable_path=r'D:/phantomjs/phantomjs-2.1.1-windows/bin/phantomjs.exe')
driver.get('https://pythonscraping.com/pages/javascript/ajaxDemo.html')
time.sleep(3)
print(driver.find_element_by_id('content').text)
driver.close()
'''
Here is some important text you want to retrieve!
A button to click!
'''
  测试完成后,即可完成安装。
  网页抓取
  我们设置了一个等待时间,因为我们需要等待 Javascript 完全加载才能获取所有信息。
  代码如下:
  from selenium import webdriver #引入网页驱动包
import time
from selenium.webdriver.remote.webelement import WebElement
from selenium.common.exceptions import StaleElementReferenceException
def waitForLoad(driver):
elem = driver.find_element_by_tag_name("html")
count = 0
while True:
count += 1
if count > 20:
print('Timing out after 10 seconds and returning')
return
time.sleep(.5)
try:
elem == driver.find_element_by_tag_name('html')
except StaleElementReferenceException:
return

driver = webdriver.PhantomJS(executable_path=r'D:/phantomjs/phantomjs-2.1.1-windows/bin/phantomjs.exe')
url='https://maoyan.com/board/4?offset=0'
driver.get(url)
waitForLoad(driver) #等待网页JavaScript加载完成
print(driver.page_source)
driver.close() #最后要将driver关闭
  网页html的部分截图。
  成功爬取电影和爬取豆瓣是一样的。代码参考《Python Web Crawler 权威指南》 查看全部

  python抓取动态网页(
爬取猫眼电影的应用技巧和基本知识点的抓取教程)
  python 网络爬虫(动态网页)
  时间:2021-08-08
  本文章向大家介绍python网络爬虫(动态网页),主要包括python网络爬虫(动态网页)用例、应用技巧、基础知识点总结和注意事项。有一定的参考价值,是需要的。朋友们可以参考一下。
  内容
  抓取动态网页
  新手开始学习爬虫,一般是从爬豆瓣开始。学会了爬豆瓣后,本来想爬其他网页玩的,后来就选择爬猫眼电影了。和豆瓣一样,我们进入猫眼电影,查看源码,可以看到很多我们想要的,但是用requests解析后,里面什么都没有。一开始还以为自己看错了,后来问了别人才知道,这是一个需要浏览器浏览的动态网页,或者是移动鼠标后才生成HTML代码。因此,为了能够顺便抓取到我们需要的信息,我们需要使用工具来模仿用户行为来生成HTML代码。
  分析网站
  解析网站时,使用requests库进行访问,也可以使用Xpath或BeautifulSoup进行解析。
  import requests
import lxml
from bs4 import BeautifulSoup
  def get_one_page(url):
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'}
response=requests.get(url,headers=headers)
soup = BeautifulSoup(response.text,'html.parser')
titles = soup.find_all('title')
print(titles)
# if response.status_code==200:# 状态响应码为200 表示正常访问
# return response.text
# return None

def main():
url='https://maoyan.com/board/4?offset=0'
html=get_one_page(url)
# print(html)

main()
  分析以上代码,发现没有我们需要的内容
  显示最后一个
  什么都解析不了,应该是用Javascript动态生成信息,所以我也学了动态Javascript抓取教程。
  在 Python 中使用 Selenium 执行 JavaScript
  Selenium 是一个强大的网页抓取工具,最初是为网站automated 测试而开发的。 Selenium 可以让浏览器自动加载网站,获取需要的数据,甚至可以对网页进行截图,或者判断网站上是否发生了某些操作。
  安装 iSelenium
  首先安装 Selenium
  pip install Selenium
  下载 PhantomJS
  安装完成后,我们还需要安装PhantomJS。因为是全功能浏览器,不是python库,所以不能用pip安装
  浏览器输入
  根据需要自行下载,下载后解压,将解压包内的bin文件夹添加到环境变量中
  driver = webdriver.PhantomJS(executable_path=r'D:/phantomjs/phantomjs-2.1.1-windows/bin/phantomjs.exe')
driver.get('https://pythonscraping.com/pages/javascript/ajaxDemo.html')
time.sleep(3)
print(driver.find_element_by_id('content').text)
driver.close()
'''
Here is some important text you want to retrieve!
A button to click!
'''
  测试完成后,即可完成安装。
  网页抓取
  我们设置了一个等待时间,因为我们需要等待 Javascript 完全加载才能获取所有信息。
  代码如下:
  from selenium import webdriver #引入网页驱动包
import time
from selenium.webdriver.remote.webelement import WebElement
from selenium.common.exceptions import StaleElementReferenceException
def waitForLoad(driver):
elem = driver.find_element_by_tag_name("html")
count = 0
while True:
count += 1
if count > 20:
print('Timing out after 10 seconds and returning')
return
time.sleep(.5)
try:
elem == driver.find_element_by_tag_name('html')
except StaleElementReferenceException:
return

driver = webdriver.PhantomJS(executable_path=r'D:/phantomjs/phantomjs-2.1.1-windows/bin/phantomjs.exe')
url='https://maoyan.com/board/4?offset=0'
driver.get(url)
waitForLoad(driver) #等待网页JavaScript加载完成
print(driver.page_source)
driver.close() #最后要将driver关闭
  网页html的部分截图。
  成功爬取电影和爬取豆瓣是一样的。代码参考《Python Web Crawler 权威指南》

python抓取动态网页(爬取网页思路的改变–selenuim的介绍和基本使用在爬虫领域)

网站优化优采云 发表了文章 • 0 个评论 • 80 次浏览 • 2021-09-11 12:09 • 来自相关话题

  python抓取动态网页(爬取网页思路的改变–selenuim的介绍和基本使用在爬虫领域)
  抓取网页的思路变化-selenuim的介绍和基本使用
  在爬虫领域,网页可以分为主要内容全部出现在HTML中的[静态网页]和需要通过执行JavaScript来显示主题内容的[动态网页]。
  假设爬虫程序需要爬取:2020中国大学排名
  访问网站时,会发现点击第二页、第三页...时,页面部分刷新,URL不会改变。这时候使用[requests]库访问,* *只获取*第一页的数据,后面18页是不可用的。
  这时候就需要了解:爬虫、浏览器和WebDriver的关系,可以浏览相关网页,这里不再赘述。 . .
  以下是重点:
  Selenium 是一个程序。国外大神团队打造的“轮子”本质上是一个成熟稳定的WebDriver程序,并在此基础上提供了丰富的功能。它也是一个开源浏览器自动化项目,提供了一组命令接口。我们可以用它向浏览器发送指令,浏览器会执行特定的操作。网页渲染完成后,会抓取对应的字段。
  传送门:(轮盘下载地址)
  温馨提示:开始练习前,请按照Selenium官方文档安装Selenium,并下载相应的浏览器WebDriver。
  元素定位方法(如下图1):
  
  以下爬取了本网站所有涉及[校名,如清华大学等]的567所学校。
  只需导入两个包。 . .
  有效代码少于 30 行。 .
  可以自己练习,基础语法,欢迎在评论区留言,有很多注意事项才可以写(看到留言会回复~~)。
  简介:
  导入selenium库,xlwt库(可选);定义一个函数parselweb,传入两个参数,url和school_info;驱动浏览器,打开url链接,css_selector选择器找到网页页码对应的css元素(如图)2),设置为制造循环(从嵌套的if语句中去掉页面“0”;(调用方法:find_element_by_css_selector(),没有s的元素)嵌套for循环,css_selector选择器遍历页面所有类=“div>.name-cn”,调用text提取文本;(调用方法:find_elements_by_css_selector())school_info调用append () 方法依次添加字符串文本,print() 打印列表元素。
  
  所有代码如下:
  from selenium import webdriver
import xlwt
#1.【selenium模块】遥控win10自带的Edge浏览器打开指定网页;
#2.查看页面共19页,撇去数字“0”,开始循环点击网页;
#3.每次点击一个网页页码,则使用【css选择器】定位指定【字段】 并提取出来存入变量 school_info;
#4.【xlwt模块】写入数据
def parselweb(url,school_info):
driver = webdriver.Edge(executable_path=&#39;msedgedriver.exe&#39;)
driver.get(url)

for i in range(20):
if i == 0:
pass
else:
driver.find_element_by_css_selector(".ant-pagination-item.ant-pagination-item-" + str(i)).click()
text1 = driver.find_elements_by_css_selector("div>.name-cn")
for ii in text1:
school_name_cn = ii.text
school_info.append(school_name_cn)
print(school_info)
print("接下来将数据传入Excel")
return school_info

def xlsbook(school_info):
xls = xlwt.Workbook()
sheet = xls.add_sheet("最好大学排名")
for val in range(len(school_info)):
sheet.write(val,0,school_info[val])
xls.save("d:/zuimeidaxue02.xls")
def main():
school_info = []
url = "https://www.shanghairanking.cn ... ot%3B
parselweb(url,school_info)
xlsbook(school_info)
main()
  运行后附上结果:
  
  
  待更新。 . . 查看全部

  python抓取动态网页(爬取网页思路的改变–selenuim的介绍和基本使用在爬虫领域)
  抓取网页的思路变化-selenuim的介绍和基本使用
  在爬虫领域,网页可以分为主要内容全部出现在HTML中的[静态网页]和需要通过执行JavaScript来显示主题内容的[动态网页]。
  假设爬虫程序需要爬取:2020中国大学排名
  访问网站时,会发现点击第二页、第三页...时,页面部分刷新,URL不会改变。这时候使用[requests]库访问,* *只获取*第一页的数据,后面18页是不可用的。
  这时候就需要了解:爬虫、浏览器和WebDriver的关系,可以浏览相关网页,这里不再赘述。 . .
  以下是重点:
  Selenium 是一个程序。国外大神团队打造的“轮子”本质上是一个成熟稳定的WebDriver程序,并在此基础上提供了丰富的功能。它也是一个开源浏览器自动化项目,提供了一组命令接口。我们可以用它向浏览器发送指令,浏览器会执行特定的操作。网页渲染完成后,会抓取对应的字段。
  传送门:(轮盘下载地址)
  温馨提示:开始练习前,请按照Selenium官方文档安装Selenium,并下载相应的浏览器WebDriver。
  元素定位方法(如下图1):
  
  以下爬取了本网站所有涉及[校名,如清华大学等]的567所学校。
  只需导入两个包。 . .
  有效代码少于 30 行。 .
  可以自己练习,基础语法,欢迎在评论区留言,有很多注意事项才可以写(看到留言会回复~~)。
  简介:
  导入selenium库,xlwt库(可选);定义一个函数parselweb,传入两个参数,url和school_info;驱动浏览器,打开url链接,css_selector选择器找到网页页码对应的css元素(如图)2),设置为制造循环(从嵌套的if语句中去掉页面“0”;(调用方法:find_element_by_css_selector(),没有s的元素)嵌套for循环,css_selector选择器遍历页面所有类=“div>.name-cn”,调用text提取文本;(调用方法:find_elements_by_css_selector())school_info调用append () 方法依次添加字符串文本,print() 打印列表元素。
  
  所有代码如下:
  from selenium import webdriver
import xlwt
#1.【selenium模块】遥控win10自带的Edge浏览器打开指定网页;
#2.查看页面共19页,撇去数字“0”,开始循环点击网页;
#3.每次点击一个网页页码,则使用【css选择器】定位指定【字段】 并提取出来存入变量 school_info;
#4.【xlwt模块】写入数据
def parselweb(url,school_info):
driver = webdriver.Edge(executable_path=&#39;msedgedriver.exe&#39;)
driver.get(url)

for i in range(20):
if i == 0:
pass
else:
driver.find_element_by_css_selector(".ant-pagination-item.ant-pagination-item-" + str(i)).click()
text1 = driver.find_elements_by_css_selector("div>.name-cn")
for ii in text1:
school_name_cn = ii.text
school_info.append(school_name_cn)
print(school_info)
print("接下来将数据传入Excel")
return school_info

def xlsbook(school_info):
xls = xlwt.Workbook()
sheet = xls.add_sheet("最好大学排名")
for val in range(len(school_info)):
sheet.write(val,0,school_info[val])
xls.save("d:/zuimeidaxue02.xls")
def main():
school_info = []
url = "https://www.shanghairanking.cn ... ot%3B
parselweb(url,school_info)
xlsbook(school_info)
main()
  运行后附上结果:
  
  
  待更新。 . .

python抓取动态网页(【干货】如何使用代码快速的进行目标内容的位置定位)

网站优化优采云 发表了文章 • 0 个评论 • 57 次浏览 • 2021-09-11 12:06 • 来自相关话题

  python抓取动态网页(【干货】如何使用代码快速的进行目标内容的位置定位)
  先试试爬虫
  前言
  通过前几章的介绍,我们对什么是爬虫有了初步的了解,同时对如何抓取网页有了一个大致的了解。从本章开始,我们将从理论走向实践,结合实际操作进一步加深理解。
  因为使用python爬取页面的工具有很多,比如requests、scrapy、PhantomJS、Splash等,而且解析爬取的页面的工具也很多。这里我们从最简单的开始,使用requests库和beautifSoup工具进行静态页面爬取和解析。
  在基本功扎实之后,我们可以使用更加灵活的工具,不仅可以静态爬行,也可以动态爬行;不仅可以抓取单个页面,还可以递归深度抓取。同时,结合其他渲染、存储、机器学习等工具,我们可以对数据进行处理、加工、建模和展示。
  实战开始
  废话不多说,先从今天的例子开始,抓拍安徒生童话中著名的“丑小鸭”。 “欲善其事,必先利其器”。在开始之前,我们需要做好准备。
  安装命令:pip install beautifulsoup4
  
  
  开始爬行的第一步是找到收录童话“丑小鸭”的链接。我们在这里使用的链接是:
  
  找到我们的目标链接后,第二步是分析网页。要分析什么?当然是分析我们要爬到哪里的内容。
  根据我们之前的介绍,我们爬虫的目的是爬取丑小鸭的文本。根据这个目标,我们首先需要研究网页的组成。那么如何查看网页呢?一般是在浏览器的开发者模式下完成的。对于chrome浏览器,我们可以使用快捷键F12查看,如图:
  
  左边是网页显示的内容,右边是网页的HTML文档。
  通过对右边页面的分析,我们可以观察到我们需要抓取的页面内容在一个
  在标签中:
  
  既然找到了页面,也找到了需要爬取的内容的位置,那么现在我们需要解决一个问题:如何使用代码快速定位目标内容?
  理想情况下,我们想要这个
  tag有一个唯一的属性(通常是id或者class),那么我们可以直接通过这个属性来定位位置。
  但不幸的是,在我们的目标标签中
  在
  ,它没有属性,更不用说独特的属性了。由于直接访问的愿望已经落空,只能使用间接访问。
  通常有两种间接方法:
  至于哪个更好,我们会根据实际情况进行分析和选择。我们在这里演示了这两种方法。
  第一种方式
  我们基于
  父标签div
  标签有唯一的class属性articleContent来查找div标签,然后根据父子关系找到p标签,然后通过正则表达式过滤掉无用的内容,得到最终结果。
  # -*- coding: utf-8 -*-
# @Author : 一凡
import requests
from bs4 import BeautifulSoup
# 正则模块
import re
# 爬取的网页
url = r"https://www.ppzuowen.com/book/ ... ot%3B
response = requests.get(url)
response.encoding=None
result = response.text
# 再次封装,获取具体标签内的内容
bs = BeautifulSoup(result, &#39;html.parser&#39;)
psg = bs.select(&#39;.articleContent > p&#39;)
title = bs.select(&#39;title&#39;)[0].text.split(&#39;_&#39;)[0]
txt = &#39;&#39;.join(str(x) for x in psg)
res = re.sub(r&#39;&#39;, "", txt)
result = res.split("(1844年)")[0]
print(&#39;标题:&#39;, title)
print(&#39;原文:&#39;, result)
  效果:
  
  实现的代码主要分为两部分:第一部分是页面的抓取,如:
  # 爬取的网页链接
url = r"https://www.ppzuowen.com/book/ ... ot%3B
response = requests.get(url)
response .encoding=None
result = response .text
print(result)
  
  这部分内容和我们在浏览器的开发者模式下看到的HTML源代码完全一样。
  第二部分是页面分析。
  我们之前介绍过,HTLML 页面本质上是一棵 DOM 树。我们用树遍历子节点来遍历HTML页面中的标签,如:
  再次打包获取特定标签中的内容
  bs = BeautifulSoup(result, &#39;html.parser&#39;)
psg = bs.select(&#39;.articleContent > p&#39;)
  这里先将页面信息转换成xml格式的文档(注意:HTML文档是一种特殊类型的xml文档),然后根据css的语法找到p标签的内容。
  第二种方式
  我们原来的方式写的代码是这样的:
  # 爬取的网页链接
url=r"https://www.ppzuowen.com/book/ ... ot%3B
response = requests.get(url)
response .encoding=None
result = response .text
# 再次封装,获取具体标签内的内容
bs = BeautifulSoup(result,&#39;html.parser&#39;)
# 具体标签
print("---------解析后的数据---------------")
# print(bs.span)
a = {}
# 获取已爬取内容中的p签内容
data = bs.find_all(&#39;p&#39;)
# 循环打印输出
for tmp in data:
print(tmp)
print(&#39;********************&#39;)
  然后我们检查输出结果,但与预期不符,是这样的:
  
  获取的内容是分段的,收录了很多其他无用的信息。其实这些都是在实际爬取过程中常见的,并不是每一次爬取都一步到位,需要不断调试。
  经过分析,我们可以用表达式过滤掉无用的信息,用字符串拼接函数拼接得到我们期望的内容。
  最终代码如下:
  # 爬取的网页链接
url=r"https://www.ppzuowen.com/book/ ... ot%3B
response = requests.get(url)
response .encoding=None
result = r.text
# 再次封装,获取具体标签内的内容
bs = BeautifulSoup(result,&#39;html.parser&#39;)
# 具体标签
print("---------解析后的数据---------------")
# print(bs.span)
a = {}
# 获取已爬取内容中的p签内容
data=bs.find_all(&#39;p&#39;)
result = &#39; &#39;
# 循环打印输出
for tmp in data:
if &#39;1844年&#39; in tmp.text:
break
result+=tmp.text

print(result)
  上面,我们已经说明了如何通过两种方式抓取一些简单的网页信息。当然,对于抓取到的内容,我们有时不仅需要输出,还可能需要存储。
  通常的存储方式是文件和数据库的形式。我们稍后会详细介绍。
  如果您想交流软件测试、接口测试、自动化测试、技术同行、持续集成和面试方面的经验。有兴趣的可以去893694563,群里会不定期分享测试数据。
  如果文章对你有帮助,请联系发财,给我点个赞。感谢您的支持。您的点赞是我不断更新的动力。 查看全部

  python抓取动态网页(【干货】如何使用代码快速的进行目标内容的位置定位)
  先试试爬虫
  前言
  通过前几章的介绍,我们对什么是爬虫有了初步的了解,同时对如何抓取网页有了一个大致的了解。从本章开始,我们将从理论走向实践,结合实际操作进一步加深理解。
  因为使用python爬取页面的工具有很多,比如requests、scrapy、PhantomJS、Splash等,而且解析爬取的页面的工具也很多。这里我们从最简单的开始,使用requests库和beautifSoup工具进行静态页面爬取和解析。
  在基本功扎实之后,我们可以使用更加灵活的工具,不仅可以静态爬行,也可以动态爬行;不仅可以抓取单个页面,还可以递归深度抓取。同时,结合其他渲染、存储、机器学习等工具,我们可以对数据进行处理、加工、建模和展示。
  实战开始
  废话不多说,先从今天的例子开始,抓拍安徒生童话中著名的“丑小鸭”。 “欲善其事,必先利其器”。在开始之前,我们需要做好准备。
  安装命令:pip install beautifulsoup4
  
  
  开始爬行的第一步是找到收录童话“丑小鸭”的链接。我们在这里使用的链接是:
  
  找到我们的目标链接后,第二步是分析网页。要分析什么?当然是分析我们要爬到哪里的内容。
  根据我们之前的介绍,我们爬虫的目的是爬取丑小鸭的文本。根据这个目标,我们首先需要研究网页的组成。那么如何查看网页呢?一般是在浏览器的开发者模式下完成的。对于chrome浏览器,我们可以使用快捷键F12查看,如图:
  
  左边是网页显示的内容,右边是网页的HTML文档。
  通过对右边页面的分析,我们可以观察到我们需要抓取的页面内容在一个
  在标签中:
  
  既然找到了页面,也找到了需要爬取的内容的位置,那么现在我们需要解决一个问题:如何使用代码快速定位目标内容?
  理想情况下,我们想要这个
  tag有一个唯一的属性(通常是id或者class),那么我们可以直接通过这个属性来定位位置。
  但不幸的是,在我们的目标标签中
  在
  ,它没有属性,更不用说独特的属性了。由于直接访问的愿望已经落空,只能使用间接访问。
  通常有两种间接方法:
  至于哪个更好,我们会根据实际情况进行分析和选择。我们在这里演示了这两种方法。
  第一种方式
  我们基于
  父标签div
  标签有唯一的class属性articleContent来查找div标签,然后根据父子关系找到p标签,然后通过正则表达式过滤掉无用的内容,得到最终结果。
  # -*- coding: utf-8 -*-
# @Author : 一凡
import requests
from bs4 import BeautifulSoup
# 正则模块
import re
# 爬取的网页
url = r"https://www.ppzuowen.com/book/ ... ot%3B
response = requests.get(url)
response.encoding=None
result = response.text
# 再次封装,获取具体标签内的内容
bs = BeautifulSoup(result, &#39;html.parser&#39;)
psg = bs.select(&#39;.articleContent > p&#39;)
title = bs.select(&#39;title&#39;)[0].text.split(&#39;_&#39;)[0]
txt = &#39;&#39;.join(str(x) for x in psg)
res = re.sub(r&#39;&#39;, "", txt)
result = res.split("(1844年)")[0]
print(&#39;标题:&#39;, title)
print(&#39;原文:&#39;, result)
  效果:
  
  实现的代码主要分为两部分:第一部分是页面的抓取,如:
  # 爬取的网页链接
url = r"https://www.ppzuowen.com/book/ ... ot%3B
response = requests.get(url)
response .encoding=None
result = response .text
print(result)
  
  这部分内容和我们在浏览器的开发者模式下看到的HTML源代码完全一样。
  第二部分是页面分析。
  我们之前介绍过,HTLML 页面本质上是一棵 DOM 树。我们用树遍历子节点来遍历HTML页面中的标签,如:
  再次打包获取特定标签中的内容
  bs = BeautifulSoup(result, &#39;html.parser&#39;)
psg = bs.select(&#39;.articleContent > p&#39;)
  这里先将页面信息转换成xml格式的文档(注意:HTML文档是一种特殊类型的xml文档),然后根据css的语法找到p标签的内容。
  第二种方式
  我们原来的方式写的代码是这样的:
  # 爬取的网页链接
url=r"https://www.ppzuowen.com/book/ ... ot%3B
response = requests.get(url)
response .encoding=None
result = response .text
# 再次封装,获取具体标签内的内容
bs = BeautifulSoup(result,&#39;html.parser&#39;)
# 具体标签
print("---------解析后的数据---------------")
# print(bs.span)
a = {}
# 获取已爬取内容中的p签内容
data = bs.find_all(&#39;p&#39;)
# 循环打印输出
for tmp in data:
print(tmp)
print(&#39;********************&#39;)
  然后我们检查输出结果,但与预期不符,是这样的:
  
  获取的内容是分段的,收录了很多其他无用的信息。其实这些都是在实际爬取过程中常见的,并不是每一次爬取都一步到位,需要不断调试。
  经过分析,我们可以用表达式过滤掉无用的信息,用字符串拼接函数拼接得到我们期望的内容。
  最终代码如下:
  # 爬取的网页链接
url=r"https://www.ppzuowen.com/book/ ... ot%3B
response = requests.get(url)
response .encoding=None
result = r.text
# 再次封装,获取具体标签内的内容
bs = BeautifulSoup(result,&#39;html.parser&#39;)
# 具体标签
print("---------解析后的数据---------------")
# print(bs.span)
a = {}
# 获取已爬取内容中的p签内容
data=bs.find_all(&#39;p&#39;)
result = &#39; &#39;
# 循环打印输出
for tmp in data:
if &#39;1844年&#39; in tmp.text:
break
result+=tmp.text

print(result)
  上面,我们已经说明了如何通过两种方式抓取一些简单的网页信息。当然,对于抓取到的内容,我们有时不仅需要输出,还可能需要存储。
  通常的存储方式是文件和数据库的形式。我们稍后会详细介绍。
  如果您想交流软件测试、接口测试、自动化测试、技术同行、持续集成和面试方面的经验。有兴趣的可以去893694563,群里会不定期分享测试数据。
  如果文章对你有帮助,请联系发财,给我点个赞。感谢您的支持。您的点赞是我不断更新的动力。

python抓取动态网页(本文实例讲述Python3实现抓取javascript动态生成的html网页功能 )

网站优化优采云 发表了文章 • 0 个评论 • 104 次浏览 • 2021-09-11 04:05 • 来自相关话题

  python抓取动态网页(本文实例讲述Python3实现抓取javascript动态生成的html网页功能
)
  本文以Python3为例,实现抓取javascript动态生成的html网页的功能。分享给大家,供大家参考,如下:
  使用urllib等抓取网页只能读取网页的静态源文件,不能读取javascript生成的内容。
  原因是urllib是瞬间抓取的。不等待javascript的加载延迟,因此页面中javascript生成的内容无法被urllib读取。
  真的没有办法读取javascript生成的内容吗?不!
  这里是一个python库:selenium,本文使用的版本是2.44.0
  先安装:
  
pip install -U selenium
  以下三个例子说明了它的用法:
  [示例 0]
  打开火狐浏览器
  使用给定的 url 地址加载页面
  
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://www.baidu.com/')
  [示例 1]
  打开火狐浏览器
  加载百度主页
  搜索“seleniumhq”
  关闭浏览器
  
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
browser = webdriver.Firefox()
browser.get('http://www.baidu.com')
assert '百度' in browser.title
elem = browser.find_element_by_name('p') # Find the search box
elem.send_keys('seleniumhq' + Keys.RETURN) # 模拟按键
browser.quit()
  [示例 2]
  Selenium WebDriver 常用于测试网络程序。以下是使用 Python 标准库 unittest 的示例:
  
import unittest
class BaiduTestCase(unittest.TestCase):
def setUp(self):
self.browser = webdriver.Firefox()
self.addCleanup(self.browser.quit)
def testPageTitle(self):
self.browser.get('http://www.baidu.com')
self.assertIn('百度', self.browser.title)
if __name__ == '__main__':
unittest.main(verbosity=2)
  希望这篇文章对你的 Python 编程有所帮助。
   查看全部

  python抓取动态网页(本文实例讲述Python3实现抓取javascript动态生成的html网页功能
)
  本文以Python3为例,实现抓取javascript动态生成的html网页的功能。分享给大家,供大家参考,如下:
  使用urllib等抓取网页只能读取网页的静态源文件,不能读取javascript生成的内容。
  原因是urllib是瞬间抓取的。不等待javascript的加载延迟,因此页面中javascript生成的内容无法被urllib读取。
  真的没有办法读取javascript生成的内容吗?不!
  这里是一个python库:selenium,本文使用的版本是2.44.0
  先安装:
  
pip install -U selenium
  以下三个例子说明了它的用法:
  [示例 0]
  打开火狐浏览器
  使用给定的 url 地址加载页面
  
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://www.baidu.com/')
  [示例 1]
  打开火狐浏览器
  加载百度主页
  搜索“seleniumhq”
  关闭浏览器
  
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
browser = webdriver.Firefox()
browser.get('http://www.baidu.com')
assert '百度' in browser.title
elem = browser.find_element_by_name('p') # Find the search box
elem.send_keys('seleniumhq' + Keys.RETURN) # 模拟按键
browser.quit()
  [示例 2]
  Selenium WebDriver 常用于测试网络程序。以下是使用 Python 标准库 unittest 的示例:
  
import unittest
class BaiduTestCase(unittest.TestCase):
def setUp(self):
self.browser = webdriver.Firefox()
self.addCleanup(self.browser.quit)
def testPageTitle(self):
self.browser.get('http://www.baidu.com')
self.assertIn('百度', self.browser.title)
if __name__ == '__main__':
unittest.main(verbosity=2)
  希望这篇文章对你的 Python 编程有所帮助。
  

python抓取动态网页(Python学习群:审查网页元素与网页源码是什么? )

网站优化优采云 发表了文章 • 0 个评论 • 48 次浏览 • 2021-09-11 04:02 • 来自相关话题

  python抓取动态网页(Python学习群:审查网页元素与网页源码是什么?
)
  简介
  以下代码是一个使用python实现的爬取动态网页的网络爬虫。此页面上最新最好的内容是由 Java 动态生成的。检查网页的元素是否与网页的源代码不同。
  
  我创建了一个学习Python的小学习圈,为大家提供了一个共同讨论和学习Python的平台。欢迎加入Python学习群:960410445讨论视频分享学习。 Python是未来的发展方向,正在挑战我们的分析能力和认识世界的方式。因此,我们与时俱进,迎接变化,不断成长。掌握Python核心技术才是真正的价值。
  
  以上是网页的源代码
  
  
  以上是回顾网页元素
  所以在这里你不能简单地使用正则表达式来获取内容。
  以下是获取内容并存入数据库的完整思路和源码。
  实施思路:
  抓取实际访问的动态页面的url-使用正则表达式获取需要的内容-解析内容-存储内容
  以上过程部分文字说明:
  获取实际访问过的动态页面的url:
  在火狐浏览器中,右键打开插件,使用**firebug review element** *(如果没有该项,安装firebug插件),找到并打开**网络(NET)** 选项卡。重新加载网页,获取网页的响应信息,包括连接地址。每个连接地址都可以在浏览器中打开。这个网站动态网页的访问地址是:
  源代码
  注:python版本为2.7
   查看全部

  python抓取动态网页(Python学习群:审查网页元素与网页源码是什么?
)
  简介
  以下代码是一个使用python实现的爬取动态网页的网络爬虫。此页面上最新最好的内容是由 Java 动态生成的。检查网页的元素是否与网页的源代码不同。
  
  我创建了一个学习Python的小学习圈,为大家提供了一个共同讨论和学习Python的平台。欢迎加入Python学习群:960410445讨论视频分享学习。 Python是未来的发展方向,正在挑战我们的分析能力和认识世界的方式。因此,我们与时俱进,迎接变化,不断成长。掌握Python核心技术才是真正的价值。
  
  以上是网页的源代码
  
  
  以上是回顾网页元素
  所以在这里你不能简单地使用正则表达式来获取内容。
  以下是获取内容并存入数据库的完整思路和源码。
  实施思路:
  抓取实际访问的动态页面的url-使用正则表达式获取需要的内容-解析内容-存储内容
  以上过程部分文字说明:
  获取实际访问过的动态页面的url:
  在火狐浏览器中,右键打开插件,使用**firebug review element** *(如果没有该项,安装firebug插件),找到并打开**网络(NET)** 选项卡。重新加载网页,获取网页的响应信息,包括连接地址。每个连接地址都可以在浏览器中打开。这个网站动态网页的访问地址是:
  源代码
  注:python版本为2.7
  

python抓取动态网页(python如何检测网页中是否存在动态加载的数据?(图))

网站优化优采云 发表了文章 • 0 个评论 • 44 次浏览 • 2021-09-11 04:00 • 来自相关话题

  python抓取动态网页(python如何检测网页中是否存在动态加载的数据?(图))
  在使用python爬虫技术采集data信息时,我们经常会遇到在返回的网页信息中,无法抓取到动态加载的可用数据。例如,当获取某个网页中的产品价格时,就会出现这种现象。如下所示。本文将实现对网页中类似动态加载数据的抓取。
  
  1. 那么什么是动态加载的数据?
  通过requests模块爬取的数据每次都看不到。部分数据是通过非浏览器地址栏中的url请求获取的。但是通过其他请求请求的数据,那么这些通过其他请求请求的数据就是动态加载的数据。 (猜测是我们访问这个页面的时候js代码会发送get请求,从其他url获取数据)
  2. 如何检测网页中是否有动态加载的数据?
  在当前页面打开抓包工具,抓包地址栏中url对应的数据包,在数据包的响应标签中搜索我们要抓取的数据,如果找到搜索结果,数据不是动态加载的,否则表示数据是动态加载的。如图:
  
  或者在要爬取的页面上右键,显示该网页的源代码。搜索我们要抓取的数据。如果找到结果,说明数据不是动态加载的,否则说明数据是动态加载的。如图:
  
  3.如果数据是动态加载的,我们如何捕获动态加载的数据?
  在抓取动态加载的数据信息时,首先需要根据动态加载技术在浏览器的网络监视器中选择网络请求的类型,然后通过一一过滤的方式查询预览信息中的关键数据,并得到对应的请求地址,最后分析信息。具体步骤如下:
<p>在浏览器中,快捷键F12打开开发者工具,然后在网络类型中选择Network(网络监视器)并选择JS,然后按快捷键F5刷新,如下图。 查看全部

  python抓取动态网页(python如何检测网页中是否存在动态加载的数据?(图))
  在使用python爬虫技术采集data信息时,我们经常会遇到在返回的网页信息中,无法抓取到动态加载的可用数据。例如,当获取某个网页中的产品价格时,就会出现这种现象。如下所示。本文将实现对网页中类似动态加载数据的抓取。
  
  1. 那么什么是动态加载的数据?
  通过requests模块爬取的数据每次都看不到。部分数据是通过非浏览器地址栏中的url请求获取的。但是通过其他请求请求的数据,那么这些通过其他请求请求的数据就是动态加载的数据。 (猜测是我们访问这个页面的时候js代码会发送get请求,从其他url获取数据)
  2. 如何检测网页中是否有动态加载的数据?
  在当前页面打开抓包工具,抓包地址栏中url对应的数据包,在数据包的响应标签中搜索我们要抓取的数据,如果找到搜索结果,数据不是动态加载的,否则表示数据是动态加载的。如图:
  
  或者在要爬取的页面上右键,显示该网页的源代码。搜索我们要抓取的数据。如果找到结果,说明数据不是动态加载的,否则说明数据是动态加载的。如图:
  
  3.如果数据是动态加载的,我们如何捕获动态加载的数据?
  在抓取动态加载的数据信息时,首先需要根据动态加载技术在浏览器的网络监视器中选择网络请求的类型,然后通过一一过滤的方式查询预览信息中的关键数据,并得到对应的请求地址,最后分析信息。具体步骤如下:
<p>在浏览器中,快捷键F12打开开发者工具,然后在网络类型中选择Network(网络监视器)并选择JS,然后按快捷键F5刷新,如下图。

官方客服QQ群

微信人工客服

QQ人工客服


线