第1章  网络爬虫入门

1.选择题

(1)B (2)A (3)D

2.简答题

(1)预先设定一个或若干个初始网页URL,将初始URL加入到待爬取URL列表中;从待爬取列表中逐个读取URL,并将URL加入到已爬取URL列表中,然后下载网页;解析已下载的网页,并存储提取的数据,从中获取新的URL;将新的URL在已爬取的URL列表中进行比对,检查该网页是否已爬取,如果网页没有被爬取,则将新的URL地址放入到待爬取URL列表的末尾,等待读取;如此往复,直到待爬取URL列表为空或者满足设定的终止条件,最终达到遍历网页的目的。

(2)门户网站、搜索引擎和大型网络服务提供商是网络爬虫的主要应用场景;有些企业也会时常借助网络爬虫采集和分析数据;当然,普通用户也可以利用网络爬虫采集自己关注的数据。

3.实践题

print('*'*26)

print('我用Python编写网络爬虫。')

print('*'*26)

第2章  爬虫基础

1.选择题

(1)A (3)A (4)D (5)C (6)C

2.填空题

(1)request、error、parse和robotparser

(2)请求的网址、请求方法、请求头和请求体

(3)响应状态码、响应头和响应体

3.实践题

import requests #导入requests模块

import time #导入time模块

headersvalue = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36',

'Cookie':'__jdu=1673555654;shshshfpa=565be4ca-07c2-cd67-78e4-92691c5c0e78-1590370825;shshshfpb=rVrKSmn2IcLo8w4GOV3s%2FvQ%3D%3D;unpl=V2_ZzNtbRAEREJxAUNcfEkLV2JQEl0RUkUUJQgTVnMdDgQzU0ZfclRCFnQUR1JnGFwUZwAZWEJcRhRFCEdkeBBVAWMDE1VGZxBFLV0CFSNGF1wjU00zQwBBQHcJFF0uSgwDYgcaDhFTQEJ2XBVQL0oMDDdRFAhyZ0AVRQhHZHseWgdjBxZaRlJzJXI4dmR5GFUDYTMTbUNnAUEpAE9ceR5VSGcEFF9GU0cScQ12VUsa;__jdv=76161171|baidu-pinzhuan|t_288551095_baidupinzhuan|cpc|0f3d30c8dba7459bb52f2eb5eba8ac7d_0_cb6f58496afc4b11b470a1d395c0eae3|1593578499694;areaId=1;ipLoc-djd=1-2800-0-0;PCSYCityID=CN_110000_110100_110108;user-key=a7ecfb5e-4ce5-45f3-bc50-f34f38529f35; __jda=122270672.1673555654.1590370824.1593575769.1593578500.5; __jdc=122270672;shshshfp=a361ce6062d6acb4a213e3fccb63cea4;cart-main=xx;cd=0;wlfstk_smdl=o0y1hhq7lhtt3bmuyyrsq4frzsm2x25l;TrackID=1bBtBpjzT4KptbszIfvAs3fgoavSXZLPO-rjd9P-eg3J0f2YgpvBSjdIiKW0synUQAkjr8iSOKnvciMPU3XkYwhLdym1pPC6JJlsY52WVqIk;thor=53783C64FD0A997288CB6CC2D828217654920A82353860FFBC08C3E814CD72E23EC5E6849607FB867D56BB6BB176E21719C7A0E6ED254BD9BEFAE84419AE8A5164F65661B13E6E9FE5D6D9A1543D1E5ED2933AA8FF5FBE38555C48D1EE365B4B2437708D39597BAF689B54B61F3E88115CFAB7D39814771A44D458655F67F6DE109AD4D41497D61F1BA892BB9B996453;pinId=fGixLn-KPTpnavPdRtFWag;pin=linglanwangyi; unick=%E5%87%8C-%E8%93%9D; ceshi3.com=000;_tp=12hoQaUhHWSC8herrlonvg%3D%3D;_pst=linglanwangyi;cn=4;3AB9D23F7A4B3C9B=PTX54LWTNEJQ2FVWJLZFXG7JIEW2QC7F7FN2Q4EQD2RWZ4HKYWOJ6WA3MFHDAPSX2SHQLN27F57I5BPG4U3L6YGVAY;shshshsID=8230af78e8b1a5f089e9e71304a10a50_7_1593578796165; __jdb=122270672.12.1673555654|5.1593578500'

} #设置请求头User-Agent和Cookie参数

url = 'https://cart.jd.com/cart.action' #定义url字符串

for i in range(1,100): #循环

#异常处理

try:

#发送请求,并将返回结果赋值给r

r = requests.get(url, headers=headersvalue, timeout=1)

except requests.Timeout:   #捕获Timeout异常

print('Timeout!')   #输出“Timeout!”

else:

print(r.status_code) #输出返回状态码

print(r.text) #输出返回状态码

time.sleep(1) #设置1s休眠时间

第3章  网页解析基础

1.选择题

(1)A (2)D (3)C (4)C (5)B (6)A (7)B (8)A

2.填空题

(1)//ul/*[@class=’listmain’]

(2)a[bcd]e

(3)loads()和dumps()

3.实践题

(1)

import chardet #导入chardet模块

import requests #导入requests模块

import urllib.parse #导入parse模块

from lxml import etree #导入etree模块

#定义字符串novel_base_url

novel_base_url = 'http://www.biqukan.com'

#将合并的url赋值给novel_url

novel_url = urllib.parse.urljoin(novel_base_url, '/50_50096/')

chapter_url_list = [] #定义列表chapter_url_list

headersvalue = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36',

} #设置请求头User-Agent信息

#定义函数,获取小说每个章节的链接

def fetch_chapter_urls():

# 设置headers,发送请求,并将返回结果赋值给r

r = requests.get(novel_url, headers=headersvalue)

html = etree.HTML(r.text) #创建HTML对象html

hrefs= html.xpath('//dd/a/@href')#选择a节点并提取href属性

for href in hrefs: #遍历

#判断href是否在chapter_url_list列表中

if href not in chapter_url_list:

#将合并的url赋值给chapter_url

chapter_url=urllib.parse.urljoin(novel_base_url,href)

#将chapter_url加入chapter_url_list列表中

chapter_url_list.append(chapter_url)

chapter_url_list.sort() #对chapter_url_list列表进行排序

#定义函数,获取每个章节的标题和正文

def parse_chapter(url):

# 设置headers,发送请求,并将返回结果赋值给r

r = requests.get(url, headers=headersvalue)

#检测返回内容编码类型

code_type = chardet.detect(r.content)['encoding']

#判编码类型是否是GB2312,如果是,改变编码类型为GBK

if code_type == 'GB2312':

code_type = 'GBK'

r.encoding = code_type #重定义返回内容编码类型

html = etree.HTML(r.text) #创建HTML类对象html

#选择h1节点并提取文本,将返回的列表第一项赋值给title

title = html.xpath('//h1/text()')[0]

#选择id属性值为“content”的节点并提取文本,将返回的列表赋值给contents

contents = html.xpath('//*[@id="content"]/text()')

content = '' #定义content字符串

for i in contents: #遍历

#移除字符串头尾的空格或换行符,与content相加并赋值给content

content += i.strip()

save_novel(title, content) #调用save_novel函数

#定义保存文件函数,将爬取的正文保存到txt文件中

def save_novel(title,content):

#异常处理

try:

#打开文件

with open(title+'.txt', 'w+', encoding='utf-8') as f:

f.write(content.strip()) #写入文件

except urllib.error.HTTPError as e: #捕获HTTPError异常

print(e.reason) #输出异常原因

else:

print('下载完成:'+title) #输出下载完成提示

if __name__=='__main__': #文件作为脚本直接执行

fetch_chapter_urls() #调用fetch_chapter_urls函数

for chapter in chapter_url_list: #遍历

parse_chapter(chapter) #调用parse_chapter函数

(2)

import requests #导入requests模块

import csv #导入csv模块

import re #导入re模块

url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2020.html' #定义字符串url

headersvalue = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'

} #设置请求头User-Agent信息

#发送请求,并将返回结果赋值给r

r = requests.get(url, headers=headersvalue)

r.encoding = 'utf-8' #重定义返回内容编码类型

html=r.text #将响应内容赋值给html

#编译正则表达式,并将返回的正则表达式对象赋值给pattern

pattern=re.compile('<tr.*?alt.*?<td>(.*?)</td>.*?<div.*?>(.*?)</div>.*?<td>(.*?)</td>.*?<td>(.*?)</td>.*?<td>(.*?)</td>.*?>(.*?)</td>.*?>(.*?)</td>.*?>(.*?)</td>.*?>(.*?)</td>.*?>(.*?)</td>.*?>(.*?)</td>.*?>(.*?)</td>.*?>(.*?)</td>.*?>(.*?)</td>.*?>(.*?)</td>',re.S)

items=re.findall(pattern, html)#查找页面中所有符合条件的字符串

#打开school_rank.csv文件写入数据

with open('school_rank.csv', 'w', newline='') as file:

writer = csv.writer(file) #初始化writer对象

writer.writerow(['排名', '学校名称', '省市', '学校类型', '总分', '办学层次得分', '学科水平得分', '办学资源得分', '师资规模与结构得分', '人才培养得分', '科研研究得分', '服务社会得分', '高端人才得分', '重大项目与成果得分', '国际竞争力得分']) #写入一行

writer.writerows(items) #写入多行

第4章  爬取动态加载数据

1.选择题

(1)A (2)B (3)A (4)D (5)B

2.填空题

(1)XHR和JS

(2)find_element_by_xpath()

(3)地址和端口

3.实践题

(1)

from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.support.wait import WebDriverWait

from selenium.common.exceptions import TimeoutException

from bs4 import BeautifulSoup

import time

import re

'''options = Options()

options.add_argument('--headless')

browser = webdriver.Chrome(options=options)'''

browser = webdriver.Chrome()

browser.maximize_window()

wait = WebDriverWait(browser, 10)

def search(keyword):

browser.get('https://search.jd.com/')

input_ = wait.until(EC.presence_of_element_located((By.ID, 'keyword')))

submit = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "input_submit")))

input_.clear()

input_.send_keys(keyword)

submit.click()

#滑到最底端

browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')

#总页数

number = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.p-skip b'))).text

return number

def change_page(page):

print("正在爬第", page, "页")

browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')

time.sleep(3)

page_box = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.p-skip input')))

page_box.clear()

page_box.send_keys(str(page))

submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.p-skip .btn')))

submit.click()

# 检查是否加载成功

wait.until(EC.text_to_be_present_in_element_value((By.CSS_SELECTOR, '.p-skip input'), str(page)))

def get_comment(link):

product_id = re.search("https://item.jd.com/(\d+).html#comment", link).group(1)

browser.get(link)

count = 0

file = open("JD_%s_comments.txt" % product_id, "a", encoding='utf-8')

while True:

try:

if count % 10 == 0:

time.sleep(3)

browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')

wait.until(EC.presence_of_element_located(

(By.CSS_SELECTOR, "#comment .comments-list [data-tab=item] .comment-con")))

soup = BeautifulSoup(browser.page_source, 'lxml')

url_list = soup.select("#comment .comments-list [data-tab=item] .comment-con")

for url in url_list:

file.write(url.text.strip() + "\n")

count += 1

next_page = wait.until(

EC.presence_of_element_located((By.CSS_SELECTOR, "#comment .ui-page .ui-pager-next")))

browser.execute_script("arguments[0].click();", next_page)

except TimeoutException:

print("已爬取", count, "页评论")

file.close()

break

if __name__ == '__main__':

number = search("口罩")

link_list = []

for page in range(1, int(number) + 1):

change_page(page)

time.sleep(3)

wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.gl-item .p-name [target=_blank]')))

url_list = browser.find_elements_by_css_selector(".gl-item .p-name [target=_blank]")

for url in url_list:

link_list.append(url.get_attribute("href") + "#comment")

for link in link_list:

get_comment(link)

(2)

import requests #导入requests模块

import json #导入json模块

import pymysql #导入mysql模块

import time #导入time模块

url = 'http://www.bjjqe.com/admin_1/json.php'

datavalue={

'act': 'index_boutique_replace',

'boutique_type': '4'

}

#连接MySQL

db = pymysql.connect(host='localhost', user='root', password='123456', port=3306)

#使用cursor()方法获取操作游标

cursor = db.cursor()

#创建数据库product_sql

cursor.execute('CREATE DATABASE IF NOT EXISTS product_sql Character Set GBK')

db.close() #断开连接

#连接MySQL,并选择product_sql数据库

db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='product_sql')

#使用cursor()方法获取操作游标

cursor = db.cursor()

#创建表products

sql = 'CREATE TABLE IF NOT EXISTS products (bookName CHAR(100), author CHAR(100), price CHAR(20), publish_company CHAR(50))'

cursor.execute(sql) #执行SQL语句

#发送HTTP请求

return_data = requests.post(url, data=datavalue).text

data = json.loads(return_data) #对HTTP响应的数据JSON化

news = data['goods_result'] #索引到需要爬取的内容信息

for n in news: #对索引出来的JSON数据进行遍历和提取

bookName = n['title']

author = n['editor']

price = n['price']

publish_company = n['publishing']

print('书名:',bookName,'作者:',author,'价格:',price,'出版社:',publish_company)

poduct = (bookName, author, price, publish_company)

try:

sql = 'INSERT INTO products(bookName, author, price, publish_company) VALUES(%s, %s, %s, %s)'

cursor.execute(sql, poduct) #执行多条SQL语句

db.commit() #提交到数据库执行

print('插入数据成功')

except:

db.rollback()

print('插入数据失败')

time.sleep(1)

第5章  反爬虫策略

1.选择题

(1)B (2)B (3)C

2.填空题

(1)通过Headers反爬虫、基于用户行为反爬虫和采用动态网页反爬虫

(2)设置Headers、使用代理IP、降低请求频率、逆向分析请求页面和使用Selenium模拟浏览器

(3)time库

3.实践题

import time #导入time模块

import random #导入random模块

import requests #导入requests模块

from bs4 import BeautifulSoup #从bs4库中导入BeautifulSoup类

#定义base_url字符串

base_url='https://www.pythontab.com/html/pythonhexinbiancheng/'

headersvalue = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'

} #设置请求头的User-Agent信息

#定义代理IP列表

proxiesvalue = [

{'http': 'http://121.232.148.167:9000'},

{'http': 'http://39.105.28.28:8118'},

{'http': 'http://113.195.18.133:9999'}

]

#定义函数获取每一页URL

def get_onepage_url(url):

url_list = [] #定义列表

#异常判断

try:

#设置代理IP,发送HTTP请求

r = requests.get(url, headers=headersvalue, proxies=random.choice(proxiesvalue))

except:

print('请求失败') #请求错误,输出“请求失败”

else:

soup = BeautifulSoup(r.text, 'lxml')#初始化BeautifulSoup对象

items = soup.select('#catlist li') #查找包含文章的li节点

for item in items:

url1 = item.select('a')[0].attrs['href'] #获取每篇文章的URL

url_list.append(url1)  #将URL添加到列表

#设置随机休眠时间

sleep_time = random.randint(0, 2) + random.random()

time.sleep(sleep_time) #程序休眠sleep_time

return url_list

#定义函数获取文章内容

def get_article(url):

# 异常判断

try:

# 设置代理IP,发送HTTP请求

r = requests.get(url, headers=headersvalue, proxies=random.choice(proxiesvalue))

except:

print('请求失败') #请求错误,输出“请求失败”

else:

soup = BeautifulSoup(r.text, 'lxml') #创建BeautifulSoup对象

title = soup.select('#Article h1')[0].string #获取文章标题

#获取文章内容

content = soup.select('#Article .content')[0].text

towrite(title, content) #调用towrite

# 设置随机休眠时间

sleep_time = random.randint(0, 2) + random.random()

time.sleep(sleep_time) #程序休眠sleep_time

#定义函数保存文章

def towrite(title, content):

#定义string字符串,表示文件命名时不能包含的特殊字符

string = ['?', '*', ':', '"', '< ', '>', '\\', '/', '|']

for i in string:

if i in title: #判断title中是否包含特殊字符

#如果包含特殊字符,则替换为“#”

title = title.replace(i, '#')

try:

# 打开文件

with open(title + '.txt', 'w+', encoding='utf-8') as f:

f.write(content.strip()) #写入文件

except: #捕获写入文件异常

print('写入文件失败:' + title) #输出写入文件失败提示

else:

print('下载完成:' + title) #输出下载完成提示

if __name__=='__main__':

for i in range(1,28): #循环

if i > 1:

url = base_url+str(i)+'.html' #组合网页URL

else:

url = base_url #第一页URL

try:

url_list = get_onepage_url(url) #调用get_onepage_url

except:                          #捕获请求异常

print('请求失败')            #输出“请求失败”

else:

for url1 in url_list: #遍历

get_article(url1) #调用get_article

第6章  模拟登录和处理验证码

1.实践题

(1)

from selenium import webdriver #导入webdriver模块

import time #导入sleep模块

#导入ActionChains模块

from selenium.webdriver import ActionChains

from PIL import Image #导入Image模块

import Chaojiying#导入Chaojiying模块

#初始化Google Chrome浏览器对象,并赋值给browser

browser = webdriver.Chrome()

browser.maximize_window() #浏览器最大化

#发送请求

browser.get('https://passport.bilibili.com/login')

time.sleep(0.5) #休眠0.5s

#定位节点并输入用户名

user_tag=browser.find_element_by_id('login-username')

user_tag = user_tag.send_keys('15210985825')

#定位节点并输入密码

pwd_tag=browser.find_element_by_id('login-passwd')

pwd_tag = pwd_tag.send_keys('123456qwerty')

time.sleep(1) #休眠1s

browser.find_element_by_css_selector('[class="btn btn-login"]').click()

time.sleep(1) #休眠1s

#显示点触验证码图片的登录页面截图

browser.save_screenshot('./main.png')

#定位验证码图片节点

img_tag=browser.find_element_by_class_name('geetest_panel_next')

location = img_tag.location #获取图片在页面中的起始位置

size = img_tag.size #获取图片在页面中显示的大小

#存储验证码图片左下角和右上角的坐标

rangle = (int(location['x']), int(location['y']), int(location['x'] + size['width']), int(location['y'] + size['height']))

i = Image.open('./main.png') #打开登录页面截图

frame = i.crop(rangle) #根据rangle进行验证码的裁剪

frame.save('./code.png') #保存验证码图片

#将验证码图片提交给超级鹰

result = Chaojiying.transform_codeImg('./code.png', 9004, 'lingyiyi', '123456qwerty', '907397')

print('超级鹰返回的坐标位置:', result) #输出超级鹰返回的坐标位置

all_list = [] #定义列表

list_1 = result.split('|') #将超级鹰返回的坐标位置以“|”切割

count_1 = len(list_1) #获取list_1的长度

for i in range(count_1):

xy_list = [] #定义列表

x = int(list_1[i].split(',')[0]) #获取x坐标

y = int(list_1[i].split(',')[1]) #获取y坐标

xy_list.append(x) #将x坐标添加到xy_list中

xy_list.append(y) #将y坐标添加到xy_list中

all_list.append(xy_list) #将xy_list添加到xy_list中

print('转换后的坐标位置', all_list)

for loc in all_list:

x = loc[0]

y = loc[1]

#通过定位到验证码图片进行位置滑动,perform立即执行

ActionChains(browser).move_to_element_with_offset(img_tag, x, y).click().perform()(2)

from selenium import webdriver #导入webdriver模块

from selenium.webdriver.common.by import By #导入By模块

#导入WebDriverWait模块

from selenium.webdriver.support.ui import WebDriverWait

#导入ActionChains 模块

from selenium.webdriver import ActionChains

#导入expected_conditions模块

from selenium.webdriver.support import expected_conditions as EC

from PIL import Image #导入Image模块

from PIL import ImageFont#导入ImageFont模块

from PIL import ImageDraw#导入ImageDraw模块

from io import BytesIO #导入BytesIO模块

import Chaojiying#导入Chaojiying模块

import time #导入time模块

#初始化Google Chrome浏览器对象,并赋值给browser

browser = webdriver.Chrome()

border = 30 #定义滑块移动距离误差

#定义函数,给图片添加文字

def add_text_to_image(image):

#设置字体样式

font = ImageFont.truetype('simhei.ttf', 32)

#在图片上添加文字 "请点击缺口左上角"

add_text = '请点击缺口左上角'

draw = ImageDraw.Draw(image)

draw.text((2, 120), add_text, '#FF0000', font=font)

#保存图片

image.save('snap.png')

#定义函数,获取验证码图片位置

def get_position():

#获取验证码图片节点

img = wait.until(

EC.presence_of_element_located((By.CSS_SELECTOR, '[class="geetest_window"]')))

time.sleep(2) #休眠2s

location = img.location #获取验证码图片坐标

size = img.size #获取验证码图片大小

#获取验证码图片位置

top, bottom, left, right = location['y'], location['y'] + size['height'], location['x'], location['x'] + size['width']

return (top, bottom, left, right) #返回验证码图片位置

#定义函数,获取图片并保存

def get_image():

time.sleep(0.2) #休眠0.2s

screenshot = browser.get_screenshot_as_png() #截取页面全屏图片

# 调用get_position函数

top, bottom, left, right = get_position()

screenshot = Image.open(BytesIO(screenshot)) #打开图片

captcha = screenshot.crop((left, top, right, bottom))

return captcha #返回图片

#定义函数,根据偏移模拟人为滑动轨迹,获取移动轨迹

def get_track(distance):

track = [] #定义移动轨迹列表track

current = 0 #初始化当前位移current

mid = distance * 4 / 5 #初始化减速阈值mid

t = 0.2 #初始化计算间隔t

v = 0 #初始化初速度v

while current < distance: #如果当前位移小于滑块偏移

if current < mid: #如果当前位移小于减速阈值

a = 2 #加速度为正2

else: #如果当前位移大于减速阈值

a = -3 #加速度为负3

v0 = v #初始化初速度v0

v = v0 + a * t #计算当前速度v

move = v0 * t + 1 / 2 * a * t * t #计算移动距离move

current += move #计算当前位移

#将该时间段位移添加到移动轨迹列表

track.append(round(move))

return track #返回移动轨迹列表

#定义函数,拖动滑块到缺口处

def move_to_gap(slider, track):

#按住滑块

ActionChains(browser).click_and_hold(slider).perform()

for x in track:

#执行移动轨迹动作

ActionChains(browser).move_by_offset(xoffset=x, yoffset=0).perform()

time.sleep(1) #休眠1s

ActionChains(browser).release().perform() #释放动作

#定义函数,实现验证操作

def crack():

# 调用get_image函数,截取带缺口图片

image = get_image()

add_text_to_image(image)

# 将验证码图片提交给超级鹰

result = Chaojiying.transform_codeImg('./snap.png', 9101, 'lingyiyi', '123456qwerty', '907397')

# 对比两张图片,获取滑动距离

gap = int(result.split(",")[0])

distance = gap - border #减去滑块移动距离误差

track = get_track(distance) #模拟人为滑动轨迹

#获取滑块节点

slider = wait.until(EC.element_to_be_clickable(

(By.CLASS_NAME,'geetest_slider_button')))

move_to_gap(slider, track) #拖动滑块

time.sleep(5) #休眠5s

if __name__ == '__main__':

#请求BOSS直聘登录页面,打开一个浏览器窗口

browser.get('https://login.zhipin.com/?ka=header-login')

time.sleep(1) #休眠1s

browser.maximize_window() #窗口最大化

time.sleep(1) #休眠1s

wait = WebDriverWait(browser, 10) #初始化WebDriverWait对象

#点击验证按钮

wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_wait'))).click()

time.sleep(2) #休眠2s

crack() #调用crack函数

第7章  爬取App和PC客户端

1.实践题

(1)

import requests

import json

headersvalue={

'Cookie': '1&_device=android&2354647e-4be8-3c87-b26c-5e33a91bc1b0&6.6.72;channel=and-d3;impl=com.ximalaya.ting.android;osversion=28;device_model=SEA-AL10;XUM=5P2h0sPL;XIM=312ea7019ebca;c-oper=%E4%B8%AD%E5%9B%BD%E7%A7%BB%E5%8A%A8;net-mode=WIFI;freeFlowType=0;res=1080%2C2259;NSUP=42e8aeb9%2C421fdc10%2C1599117494905;AID=rSUrJvkxLdw=;manufacturer=HUAWEI;XD=YrBEo/u5jJlB11rljobr+vkUi6YnAZSx8hFyh1gmtdKEmRDnqx3cy9eozH5gjlMk/rkaXTaqBETMu4cd7ZneKElTaJEPETRMzaT2HTiN5JBlgRKnhLIX3smzSPWhEgv5P6DXGNGNv2+xdH8m3BpvY5Sj/6m7OeIW/OFFSBD05/E=;umid=aied88addff903ebd606cd7b8156776b8d;xm_grade=0;minorProtectionStatus=0;oaid=feeefcdb-effa-9bba-5e55-85ed7efd65af;newChannelId=yz-huawei;fp=00921715752122q22v64vv55080000;domain=.ximalaya.com;path=/;',

'Cookie2': '$version=1',

'Accept': '*/*',

'user-agent': 'ting_6.6.72(SEA-AL10,Android28)',

'Host': 'mobwsa.ximalaya.com',

'Connection': 'Keep-Alive',

'Accept-Encoding': 'gzip'

}

requests.packages.urllib3.disable_warnings()

for i in range(5):

url = 'http://mobwsa.ximalaya.com/discovery-ranking-web/v3/category/concreteRankList/ts-1599118668274?device=android&isAnchor=false&pageSize=20&rankingListId=51&version=6.6.72'

url = url + '&pageId=' + str(i+1)

r = requests.get(url, headers=headersvalue, verify=False)#

json_data = json.loads(r.text)['data']['list']

for data in json_data:

print(data['title'], data['intro'])

(2)

import requests

import json

headersvalue={

'Host': 'mp.weixin.qq.com',

'Connection': 'keep-alive',

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1301.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat',

'X-Requested-With': 'XMLHttpRequest',

'Accept': '*/*',

'Referer':'https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzI4NjIxNTc2OA==&uin=MTE1MTAwMjM4Mg%3D%3D&key=281d398fa0af70c9f36243839c648f99351ec37d937e93339c8405b43dbe6dcc5343d63a12abb3975e17d9489436e3bcc2799ff2e02581a73412320cf4cd5cdc2fe44a45b343c2e1d972fa2521a2d0cde91e18f37374a9c705d46e0d0880a937f3989dfe204bb53c573b1cddeb2fdb301a61b47b99fa44ec31d8a42c87f6b5c7&devicetype=Windows+10+x64&version=62090538&lang=zh_CN&a8scene=7&pass_ticket=c0WoudB5pZm9Qn4wsO4orgJHjAEBPQvM6hhNNIdEt0TWozisRjt8SpK%2B8N%2FYMBuC&winzoom=1',

'Accept-Encoding': 'gzip, deflate',

'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.5;q=0.4',

'Cookie': 'rewardsn=; wxtokenkey=777; wxuin=1151002382; devicetype=android-28; version=27000d39;lang=zh_CN;pass_ticket=c0WoudB5pZm9Qn4wsO4orgJHjAEBPQvM6hhNNIdEt0TWozisRjt8SpK8N/YMBuC;wap_sid2=CI7O66QEEooBeV9IRVJ4aXY0UmVTVlF5OUV4bV9kcERHRDg1NGY5TEJtQk5YZktZT2x0ZlQ0VFB1bUFhV0tXVjUwY1pSUHBhRHpXZkhPSmt4QWMxSVNYNGlQdFJRZW5RMXhrSWZEQWs5dlhSTTlCZjF3NjZLM294eS1SR2xERGxqeUhob2xxYkE3bHJ4UVNBQUF+MKLci/sFOA1AlU4='

}

requests.packages.urllib3.disable_warnings()

for i in range(99):

url = 'https://mp.weixin.qq.com/mp/profile_ext?action=getmsg&__biz=MzI4NjIxNTc2OA' \

'==&f=json&count=10&is_ok=1&scene=&uin=MTE1MTAwMjM4Mg%3D%3D&key=' \

'281d398fa0af70c9f36243839c648f99351ec37d937e93339c8405b43dbe6dc' \

'c5343d63a12abb3975e17d9489436e3bcc2799ff2e02581a73412320cf4cd5c' \

'dc2fe44a45b343c2e1d972fa2521a2d0cde91e18f37374a9c705d46e0d0880a' \

'937f3989dfe204bb53c573b1cddeb2fdb301a61b47b99fa44ec31d8a42c87f6' \

'b5c7&pass_ticket=c0WoudB5pZm9Qn4wsO4orgJHjAEBPQvM6hhNNIdEt0TWoz' \

'isRjt8SpK%2B8N%2FYMBuC&wxtoken=&appmsg_token=1079_D4vhykniky0g3' \

'R6fLrWwBFfxFIpIapUodqy4iQ~~&x5=0&f=json'

url = url + '&offset='+str(i)

r = requests.get(url, headers=headersvalue, verify=False)

json_data = json.loads(r.text)

general_msg_list = json.loads(json_data['general_msg_list'])

title = general_msg_list['list'][0]['app_msg_ext_info']['title']

print(title)

content_url = general_msg_list['list'][0]['app_msg_ext_info']['content_url']

print(content_url)

《python网络爬虫》1-7章答案相关推荐

  1. python网络爬虫_一篇文章教会你利用Python网络爬虫获取穷游攻略

    点击上方"IT共享之家",进行关注 回复"资料"可获赠Python学习福利 [一.项目背景] 穷游网提供原创实用的出境游旅行指南.攻略,旅行社区和问答交流平台, ...

  2. 《python 网络爬虫技术》参考答案 第1章~第7章

    第1章  网络爬虫入门 1.选择题 (1)B (2)A (3)D 2.简答题 (1)预先设定一个或若干个初始网页URL,将初始URL加入到待爬取URL列表中:从待爬取列表中逐个读取URL,并将URL加 ...

  3. 《python 网络爬虫技术》参考答案 第4章~第5章

    第4章  爬取动态加载数据 1.选择题 (1)A (2)B (3)A (4)D (5)B 2.填空题 (1)XHR和JS (2)find_element_by_xpath() (3)地址和端口 3.实 ...

  4. python网络爬虫技术实训答案_python网络爬虫实训

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  5. python网络爬虫技术课后答案_尔雅《Python网络爬虫技术(2020年秋季学期)》网课答案...

    尔雅<Python网络爬虫技术(2020年秋季学期)>网课答案 法律的一般含义是() 答:法律是由国家创制并保证实施的行为规范 下列属于急症手术的是 答:肝破裂 脾气统摄血液的功能,实际上 ...

  6. Python网络爬虫与信息提取(17)—— 题库爬取与整理+下载答案

    前言 上一节实现了题目的整理,没整理答案是不完整的,所以这一节加上答案的爬取. 上一节地址:Python网络爬虫与信息提取(16)-- 题库爬取与整理 效果 思路 爬答案有点难搞,像这种题库的答案都是 ...

  7. python网络爬虫从入门到实践 第5章 (二)

    python网络爬虫从入门到实践 第5章 (二) https://beijing.anjuke.com/sale/ \xa0 是不间断空白符   我们通常所用的空格是 \x20 ,是在标准ASCII可 ...

  8. 《Python网络爬虫从入门到实践 第2版》第14章 爬虫实践一:维基百科

    第14章 爬虫实践一:维基百科 "是骡子是马,拉出来遛遛".我们已经将Python网络爬虫的技术系统地学习完了,后面几个章节开始进入实践环节.每一章都会使用之前学习的技术,通过实践 ...

  9. 一篇文章教会你利用Python网络爬虫获取电影天堂视频下载链接

    [一.项目背景] 相信大家都有一种头疼的体验,要下载电影特别费劲,对吧?要一部一部的下载,而且不能直观的知道最近电影更新的状态. 今天小编以电影天堂为例,带大家更直观的去看自己喜欢的电影,并且下载下来 ...

  10. 《Python网络爬虫——从入门到实践》第六章将数据存储至MySQL数据库的学习心得与总结(出错与纠正方法)

    <Python网络爬虫--从入门到实践>第六章将数据存储至MySQL数据库的学习心得与总结(出错与纠正方法) 作为刚开始入门python的小白,对大数据,网络爬虫比较感兴趣.完全是自我修炼 ...

最新文章

  1. 用数学诠释生命——当今生物信息与计算生物学回顾(一)
  2. IDEA添加mybatis-mapper的模板
  3. Twproject Gantt – 开源的 JavaScript 甘特图组件
  4. java基本数据类型_资深大厂Java程序员,由浅入深Java学习资料,高清视频
  5. Atititjs javascript异常处理机制与java异常的转换.js exception process
  6. 【python教程入门学习】Pygame下载和安装
  7. 安装软件Mimics过程记录
  8. smith圆图重要性_smith圆图的理解
  9. 企业微信开发,嵌入自定义项目,及JS-SDK的引用
  10. ARM汇编之TCP Bind Shell
  11. Glyphs App Essential Training Glyphs App基础教程 Lynda课程中文字幕
  12. HTTP协议——请求格式及方法
  13. HTML网页调用海康摄像头,[FastVideo]Web Html5 无插件方式连接海康摄像头[2]
  14. 环信IM即时通讯集成-遇到问题及创建默认会话+默认欢迎语
  15. 身体检查 生化全套 血常规 微量元素
  16. 计算机主机配置科普,一秒看懂电脑配置,组装电脑不求人
  17. The linked library ‘xxx‘ is missing one or more architectures required by this target: arm
  18. ESP8266的PC客户端和Arduino两种方式的连接及使用笔记
  19. 情人节翻译软件测试,情人节甜蜜制造机|互动装置干货精选
  20. 信号完整性分析学习--18--源端匹配

热门文章

  1. 微信小程序-001-抽签功能-002-新建抽签
  2. 解决新版edge浏览器首页被搜狗、haoqq等垃圾搜索引擎捆绑问题,并将启动首页设为edge自带新标签页
  3. iOS开发之千呼万唤始出来iOS10更新内容以及iOS 10的闪退问题解决
  4. 关于计算机上使用的光盘,电脑中使用Windows DVD Maker制作光盘的方法
  5. python爬虫实践——自动登录抽屉新热榜
  6. D. Three Religions
  7. brew install速度过慢
  8. 深入理解G1垃圾收集器
  9. 税务信息化与计算机技术应用开发,税务信息化与计算机技术应用开发工作岗位年度个人工作总结...
  10. python发送cmd命令_python 执行终端/控制台命令的例子 如何使用python在同一个控制台发送cmd命令...