目的
1、掌握正则表达式的使用,会使用re模块解析网页数据。
2、掌握Xpath语法的使用,会使用lxml库解析网页数据。
3、掌握Beautifulsoup的使用,会使bs4库解析网页数据。
4、掌握JSONPath语法的使用,会使用json模块解析网页数据。
任务
爬取图书排行榜包括书名、原价、促销价、评论数、作者、出品时间以及出版社;
import requests
import re
from time import sleep
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}
#从网页获取所有内容,以列表的方式返回
def getInfo(page):
page = str(page)
url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-' +page
response = requests.get(url=url, headers=headers).text
ex = '(?<=<li>\s)[\w\W]*?(?=<\/li>)'
p = re.findall(ex,response)#p的前三个元素是无用数据
del p[0:3]#删除前三个元素
return p
#根据传入的字符串解析第几本,返回字符串
def getIndex(str):
ex = 'list_num.*?>(.*?)<'
p = re.findall(ex,str)
return p[0]
#返回书名书名
def getName(str):
ex = 'title="(.*)"\/'
p = re.findall(ex,str)
return p[0]
#获取评论数量
def getCommentCount(str):
ex = '_blank">([\d]+.*?)<'
p = re.findall(ex,str)
return p[0]
#获取作者
def getWriter(str):
ex = 'title="(.*?)"'
p = re.findall(ex,str)
# return p[2]
try:
return p[2]
except:
return "暂未找到"
#获取出品时间
def getTime(str):
ex = '<span>(.*?)<'
p = p = re.findall(ex,str)
return p[0]
#获取出版社
def getPub(str):
ex = 'key=(.*?)"'
p = re.findall(ex,str)
return p[-1]
#获取价格
def getPriceFir(str):
ex = 'price_r">.*?;(.*)<'
p = re.findall(ex,str)
return p[0]
#获取促销价格
def getPriceNow(str):
ex = 'price_n">.*?;(.*)<'
p = re.findall(ex, str)
return p[0]
def main():
for page in range(1,26):
list = getInfo(page)
for info in list:
index = getIndex(info)
name = getName(info)
priceFir = getPriceFir(info)
priceNow = getPriceNow(info)
commentCount = getCommentCount(info)
writer = getWriter(info)
time = getTime(info)
pub = getPub(info)
print("{}书名:{} {} 作者:{} ".format(index,name,commentCount,writer))
print("出版时间:{} 出版社:{} 原价:{} 促销价:{}".format(time,pub,priceFir,priceNow))
sleep(0.5)
main()