爬虫高级

这篇博客详细介绍了Python爬虫的高级技巧,包括利用selenium和phantomjs处理动态网站,多线程爬虫的实现,以及BeautifulSoup的使用。此外,还讲解了Scrapy框架的安装与使用,以及如何在PyCharm中运行Scrapy项目。文章还涵盖了设置随机User-Agent、代理和Scrapy对接selenium+phantomjs的方法,最后提到了分布式爬虫的概念和scrapy-redis的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Day05笔记*****************************

1、json模块

  1、什么是json?(数据传输的格式)
    javascript中的对象和数组
    对象 :{key:value}  取值:对象名.key
    数组 :[...,...]	取值:数组[索引值]
  2、作用
    json格式的字符串 和 Python数据类型 之间的转换
  3、常用方法
    1、json.loads() : json格式 --> Python数据类型
              json      python
			对象  ——>   字典
			数组  ——>   列表
  			见 01_json.loads示例.py
    2、json.dumps() : Python数据类型 --> json格式
	              python       json
					字典         对象
					列表         数组
					元组         数组
	      ## 注意
	        1、json.dumps()在序列化时默认使用ascii编码
			2、添加参数ensure_ascii=False,表示禁用ascii编码
'''01_json.loads实例'''
import json

#json格式的数组
jsarray = '[1,2,3,4]'
#数组->列表
L = json.loads(jsarray)
print(type(L),L)

#json格式对象
jsobj = '{"city":"天地会","name":"步惊云"}'
#对象->字典
D = json.loads(jsobj)
print(type(D),D)

结果:
在这里插入图片描述

"""
Created on Wed Sep 18 23:48:05 2019

@author: aa
"""
'''02_json.dumps实例'''
import json

L = [1,2,3,4]
T = (1,2,3,4)
D = {"city":"天地会","name":"逆风"}
#python格式 ->json格式
jsarry1 = json.dumps(L)
print(type(jsarry1),jsarry1)

jsarry2 = json.dumps(T)
print(type(jsarry2),jsarry2)

jsaobj = json.dumps(D,ensure_ascii = False)
print(type(jsaobj),jsaobj)

在这里插入图片描述

2、动态网站数据抓取 - Ajax

1、特点 :滚动鼠标滑轮时加载
2、案例 :豆瓣电影排行榜数据抓取
1、抓取目标 :豆瓣电影 - 排行榜 - 剧情
电影名称 、评分
2、代码实现

'''03_豆瓣电影抓取-Ajax.py'''
import requests
import json
import csv

# url要写抓到的GET :URL
url = "https://movie.douban.com/j/chart/top_list?"
headers = {"User-Agent":"Mozilla/5.0"}
num = input("请输入要爬取的数量:")
params = {
        "type":"11",
        "interval_id":"100:90",
        "action":"",	
        "start":"0",
        "limit":num
    }

res = requests.get(url,params=params,headers=headers)
res.encoding = "utf-8"
# html为json格式的数组[{电影1信息},{},{}]
html = res.text
# 数组 -> 列表
html = json.loads(html)
# 用for循环遍历每一个电影信息{}
for film in html:
    name = film['title']
    score = film["rating"][0]
    #{"rating":["9.6","50"],...}
    with open("豆瓣电影.csv","a",newline="") as f:
        writer = csv.writer(f)
        L = [name,score]
        writer.writerow(L)

这里需要注意的就是这个使用get的url,因为我的Fiddler 无法安装证书,所以拿不到get的url,这个url是老师上课讲的。

'''03_豆瓣电影抓取-Ajax.py'''
import requests
import json
import csv

# url要写抓到的GET :URL
url = "https://movie.douban.com/j/chart/top_list?"
headers = {"User-Agent":"Mozilla/5.0"}
L = ["剧情","喜剧","动作"]
tp_list = [{"剧情":"11"},{"喜剧":"24"},{"动作":"5"}]
tp = input("请输入电影类型:")

if tp in L:
    num = input("请输入要爬取的数量:")
    for film_dict in tp_list:
        for key,value in film_dict.items():
            if tp == key:
                params = {
                        "type":value,
                        "interval_id":"100:90",
                        "action":"",	
                        "start":"0",
                        "limit":num
                    }
                
                res = requests.get(url,params=params,headers=headers)
                res.encoding = "utf-8"
                # html为json格式的数组[{电影1信息},{},{}]
                html = res.text
                # 数组 -> 列表
                html = json.loads(html)
                # 用for循环遍历每一个电影信息{}
                for film in html:
                    name = film['title']
                    score = film["rating"][0]
                    #{"rating":["9.6","50"],...}
                    with open("豆瓣电影.csv","a",newline="") as f:
                        writer = csv.writer(f)
                        L = [name,score]
                        writer.writerow(L)
else:
    print("您输入的类型不存在!")

在这里插入图片描述
在这里插入图片描述

3、selenium + phantomjs 强大的网络爬虫组合

1、selenium

1、定义 :Web自动化测试工具,应用于Web自动化测试
2、特点
  1、可以运行在浏览器,根据指定命令操作浏览器,让浏览器自动加载页面
  2、只是工具,不是浏览器,不支持浏览器功能,需要与第三方浏览器结合使用

2、phantomjs

1、定义 :无界面浏览器(无头浏览器)
2、特点
  1、把网站加载到内存进行页面加载
  2、运行高效
3、安装
  1、Windows
    1、将下载的可执行文件放到Python安装目录的Scripts目录下
  C:\Python36\Scripts
  安装:
  chromedriver.exe
  phantomjs.exe
  2、Ubuntu
    1、将下载的phantomjs放到一个路径下
	2、添加环境变量:
	  vi .bashrc 添加
	  export PHANTOM_JS=/home/.../phantomjs-2.1.1-...
	  export PATH=$PHANTOM_JS/bin:$PATH
	  终端:source .bashrc
	  终端:phantomjs

我在phantomjs官网上无法下载phantomjs.exe,所以就没有安装,只是安装了chromedriver.exe

3、示例代码

1、示例代码1 : 见05_phantomjs+selenium示例1.py

'''05_phantomjs+selenium示例1.py'''
from selenium import webdriver
#创建一个chromjs浏览器对象
driver = webdriver.Chrome()
#发请求
driver.get("http://www.baidu.com/")
#获取响应的html源码
print(driver.page_source)
#获取网页截屏
driver.save_screenshot("百度.png")
#print("图片保存成功")
##关闭
driver.quit()

在这里插入图片描述

2、示例代码2 : 见06_phantomjs+selenium示例2.py
# -*- coding: utf-8 -*-
"""
Created on Fri Sep 20 00:01:39 2019

@author: aa
"""

#06_phantomjs+selenium示例2.py
from selenium import webdriver
import time
#创建浏览器对象
driver = webdriver.Chrome()

#打开页面
driver.get("http://www.baidu.com/")

#发送文字到搜索框
kw = driver.find_element_by_id("kw")
kw.send_keys("易烊千玺")

#点击“百度一下”
su = driver.find_element_by_id("su")
su.click()
time.sleep(1)
#获取截屏
driver.save_screenshot("千玺.png")

#关闭浏览器
driver.quit()

这个很好玩,你什么都不用干,感觉浏览器可以听懂你的话,搜索—>百度一下—>保存图片
在这里插入图片描述
大佬的图片就是赏心悦目

4、常用方法

1、driver.get(url)
2、driver.page_source : 获取响应的html源码(有用)
3、driver.page_source.find("字符串")
  1、作用 :从html源码中搜索指定字符串
     -1	   :查找失败
	非-1   :查找成功
4、单元素查找
  1、driver.find_element_by_id("").text(获取节点里面的文本内容)
  2、driver.find_element_by_class_name("")
  3、driver.find_element_by_xpath('xpath表达式')
  4、如果匹配到多个节点,则只返回第1个节点对象
5、多元素查找
  1、driver.find_elements_by_....
  2、注意
    1、如果结果1个,则返回节点对象,不是列表
	2、如果结果N个,则返回列表,;列表里的每个对象就是节点元素
  3、示例见 :08_driver.find查找元素示例.py
6、对象名.send_keys("内容")
7、对象名.click()

5、案例1 :登录豆瓣网站

见 :09_selenium+Chrome登陆豆瓣案例.py
# -*- coding: utf-8 -*-
"""
Created on Fri Sep 20 19:35:05 2019
09_selenium+Chrome登陆豆瓣案例
@author: aa
"""
from selenium import webdriver
import time
#创建浏览器对象,发请求
driver = webdriver.Chrome()
driver.get("https://www.douban.com/")
time.sleep(0.5)
#获取截图(验证码)
driver.save_screenshot("验证码.png")

#找用户名、密码、验证、登录豆瓣按钮
#用户名
uname = driver.find
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值