以后每天写一两篇文章,大概一个月左右能把以前学爬虫的笔记整理好,孬好就这样了,以后去工厂还是工地都无所谓了,不纠结到底做什么了,反正编程只是爱好~
爬豆瓣
import requests
from lxml import etree
'''1. 将目标网站上的页面抓取下来'''
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
'Referer': 'https://movie.douban.com/'
}
url = 'https://movie.douban.com/cinema/nowplaying/hefei/'
response = requests.get(url, headers=headers)
text = response.text # 豆瓣的代码比较正规,可以直接用text自动解码
'''2. 将抓取下来的数据提炼'''
html = etree.HTML(text)
ul = html.xpath('//ul[@class="lists"]')[0] # ul标签不止一个所以这里带上[0]
lis = ul.xpath('./li') # 获取ul标签下的所有li标签
movies = []
for li in lis: # 遍历出所有的li标签,并同时获取到li标签里面对应的片名,评分,片长等信息
title = li.xpath('@data-title')[0]
score = li.xpath('@data-score')[0]
duration = li.xpath('@data-duration')[0]
region = li.xpath('@data-region')[0]
director = li.xpath('@data-director')[0]
actors = li.xpath('@data-actors')[0]
thumbamli = li.xpath('.//img/@src')[0]
movie = {
'片名': title,
'评分': score,
'片长': duration,
'国家': region,
'导演': director,
'演员': actors,
'海报': thumbamli,
}
movies.append(movie)
for i in movies:
print(i)
爬电影天堂
from lxml import etree
import requests
BASE_DOMAIN = 'https://www.dytt8.net'
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
def get_detail_urls(url): # 获取电影详情页url的函数
response = requests.get(url, headers=HEADERS)
# print(response.encoding) # 查看requests模块当前自动解码使用的编码方式
text = response.text # 因为只是获取url链接所以这里用text,调用模块自己的解码,
# 这个网站如果使用.content 自己指定编码会报错,因为这个网站里面有很多不规范的编码方式
# 所以使用.text 让模块自己解码,如需要针对某一个页面或标签进行解码的时候可以单独解码:
# text = response.text.encode('gb2312').decode('gb2312')
html = etree.HTML(text)
detail_urls = html.xpath('//table[@class="tbspan"]//a/@href')
# 直接一步获取class="tbspan"的table标签下的a标签的href属性
detail_urls = list(map(lambda a: BASE_DOMAIN + a, detail_urls))
return detail_urls
'''上面的map函数等价于:
def abc(a): 先定义一个函数,参数a
return BASE_DOMAIN + a 返回 BASE_DOMAIN + 参数a
index = 0
for detail_url in detail_urls:
detail_url = abc(detail_url) 把列表detail_urls每次遍历出来的值作为上面函数的参数并调用执行这个函数
detail_urls[index] = detail_url 把被这个函数糟蹋过的值按照原位改变赋值给列表detail_urls对应的下标
index += 1
'''
def parse_detail_page(url): # 获取详情页里的标题、导演演员等...
movie = {}
response = requests.get(url, headers=HEADERS)
text = response.content.decode('gbk')
html = etree.HTML(text)
title = html.xpath('//div[@class="title_all"]//font[@color="#07519a"]/text()')[0]
movie['片名'] = title
zoomE = html.xpath('//div[@id="Zoom"]')[0]
imgs = zoomE.xpath('.//img/@src')
if len(imgs) > 1:
cover = imgs[0]
screenshot = imgs[1]
movie['海报'] = cover
movie['影片截图'] = screenshot
infos = zoomE.xpath('.//text()')
# 这里已经匹配到所有的影片信息了,所有内容包括换行符什么的全部放到列表里了
# 所以下面要通过遍历查找出需要的影片信息
# return infos
def parse_info(info, rule): # 用来去除空格和影片信息标题的函数
return info.replace(rule, '').strip()
# .replace()是替换字符串中指定子字符串(子文本替换);
# .strip()方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列,注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
for index, info in enumerate(infos):
if info.startswith('◎年 代'): # .startswith()是以什么什么开头
info = parse_info(info, '◎年 代')
movie['年代'] = info
elif info.startswith('◎产 地'):
info = parse_info(info, '◎产 地')
movie['产地'] = info
elif info.startswith('◎类 别'):
info = parse_info(info, '◎类 别')
movie['类别'] = info
elif info.startswith('◎豆瓣评分'):
info = parse_info(info, '◎豆瓣评分')
movie['豆瓣评分'] = info
elif info.startswith('◎片 长'):
info = parse_info(info, '◎片 长')
movie['片长'] = info
elif info.startswith('◎导 演'):
info = parse_info(info, '◎导 演')
movie['导演'] = info
elif info.startswith('◎编 剧'):
info = parse_info(info, '◎编 剧')
movie['编剧'] = info
elif info.startswith('◎主 演'):
info = parse_info(info, '◎主 演')
actors = [info] # 主演是每行一个的,所以要for循环遍历出所有演员;这里先把这个已经遍历出来的加到列表里
for i in range(index + 1, len(infos)):
# index是上面一层for循环记录当前遍历次数的,这里是想让上面的for循环一直遍历下去
actor = infos[i].strip() # .strip() 删除空格后赋值给actor
if actor.startswith('◎'): # 直到遇到开头为◎的字符,说明演员的信息遍历完了
break # 跳出循环
actors.append(actor) # 把遍历到的主演名字追加到列表里
movie['主演'] = actors # 把结果(列表)放到字典表里
elif info.startswith('◎简 介'):
info = parse_info(info, '◎简 介')
profiles = [info] # 简介前面有个换行,所以跟主演一样需要遍历
for i in range(index + 1, len(infos)):
profile = infos[i].strip() # .strip() 删除空格后赋值给profile
if profile.startswith('【下载地址】'): # 直到遇到开头为【下载地址】的字符,说明简介的信息遍历完了
break # 跳出循环
profiles.append(profile) # 把遍历到的所有简介内容追加到列表里
movie['简介'] = ''.join(profiles) # 把结果(列表)以空白字符转换成字符串,放到字典表里
download = html.xpath('//td[@style="WORD-WRAP: break-word"]/a/@href')[0]
movie['下载地址'] = download
return movie
def spider(): # 调用url函数和解析数据函数并执行爬虫
base_url = 'https://www.dytt8.net/html/gndy/dyzz/list_23_{}.html'
movies = []
for i in range(1, 101): # 控制页数的for循环
url = base_url.format(i) # 构造列表页的url
print('第' + str(i) + '页电影如下:' + url)
detail_urls = get_detail_urls(url) # 执行获取详情页url链接的函数并赋值给detail_urls
# print(detail_urls)
for index, detail_url in enumerate(detail_urls): # 遍历每一页所有电影详情页面的url的for循环
movie = parse_detail_page(detail_url) # 执行获取详电影情页内容的函数 传递每次遍历的url
movies.append(movie) # 最终结果加入到列表里
with open(r'C:\Users\Administrator\Desktop\movie.txt', 'a', encoding='utf-8') as f:
f.write(str(movie) + '\n')
print(movie) # 遍历一次打印一次:字典表
# print(movies) # 打印所有加入到列表里后的结果:列表
if __name__ == '__main__':
spider()
爬腾讯招聘
import requests
from lxml import etree
BSE_DOMAIN = 'https://hr.tencent.com/'
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
def get_detail_urls(url): # 获取详情页url
response = requests.get(url, headers=HEADERS)
text = response.text
html = etree.HTML(text)
detail_urls = html.xpath('//table[@class="tablelist"]//tr[@class!="h" and @class!="f"]//a/@href')
detail_urls = list(map(lambda a: BSE_DOMAIN + a, detail_urls))
return detail_urls
def parse_detail_page(url): # 解析招聘信息
txzp = {}
response = requests.get(url, headers=HEADERS)
test = response.text
# print(test)
html = etree.HTML(test)
title = html.xpath('//tr[@class="h"]/td/text()')[0]
txzp['职位'] = title
gznrs = html.xpath('//table[@class="tablelist textl"]//text()')
# return gznrs
for index, gznr in enumerate(gznrs):
if gznr.startswith('工作地点:'):
for i in range(index + 1, index + 2):
gznr = gznrs[i].replace('工作地点:', '').strip()
txzp['工作地点:'] = gznr
elif gznr.startswith('职位类别:'):
for i in range(index + 1, index + 2):
gznr = gznrs[i].replace('职位类别:', '').strip()
txzp['职位类别:'] = gznr
elif gznr.startswith('招聘人数:'):
for i in range(index + 1, index + 2):
gznr = gznrs[i].replace('招聘人数:', '').strip()
txzp['招聘人数:'] = gznr
elif gznr.startswith('工作职责:'):
gzzzs = []
for i in range(index + 1, len(gznrs)):
gzzz = gznrs[i].replace('工作职责:', '').strip()
if gzzz.startswith('工作要求:'):
break
gzzzs.append(gzzz)
txzp['工作职责'] = ''.join(gzzzs)
elif gznr.startswith('工作要求:'):
gzyqs = []
for i in range(index + 1, len(gznrs)):
gzyq = gznrs[i].replace('工作要求:', '').strip()
if gzyq.startswith('申请岗位'):
break
gzyqs.append(gzyq)
txzp['工作要求'] = ''.join(gzyqs)
return txzp
def spider(): # 执行爬虫
base_url = 'https://hr.tencent.com/position.php?lid=&tid=&keywords=python&start={}'
txzps = []
for i in range(0, 91, 10): # 0-91,间隔10递增:0 10 20 30 40 50 60 70 80 90
url = base_url.format(i) # 构造列表页url
print(url)
detail_urls = get_detail_urls(url) # 获取每一列表页的详情页url
# print(detail_urls)
for detail_url in detail_urls: # 遍历每一列表页的详情页url
txzp = parse_detail_page(detail_url) # 解析数据
txzps.append(txzp)
print(txzp)
# print(txzps)
if __name__ == '__main__':
spider()
这篇文章是我以前看知了课堂的21天搞定Python分布爬虫时的笔记
只是整理笔记,方便自己以后忘了回头再看,大神勿喷。