不同磁力链网站网页内容都不同,需要定制

1,并发爬取

并发爬取后,好像一会就被封了

import requests
from lxml import etree
import re
from concurrent.futures import ThreadPoolExecutor def get_mlink(url, headers):
"""输入某影片磁力链所在的网页,返回该网页中的磁力链"""
r = requests.get(url, headers=headers)
select = etree.HTML(r.text)
try:
magnetlink = select.xpath('//textarea[@id="magnetLink"]//text()')
return magnetlink[0]
except AttributeError:
return None def get_page_mlinks(url, headers):
"""输入某一页搜索结果,返回该网页中所有的元组(url, 影片大小,时间,磁力链)"""
r = requests.get(url, headers=headers)
select = etree.HTML(r.text)
div_rows = select.xpath('//div[@class="row"]') def get_each(se):
size = se.xpath('.//div[@class="col-sm-2 col-lg-1 hidden-xs text-right size"]//text()')
date = se.xpath('.//div[@class="col-sm-2 col-lg-2 hidden-xs text-right date"]//text()')
href = se.xpath('.//a/@href')
try:
return href[0], size[0], date[0], get_mlink(href[0], headers)
except IndexError:
pass with ThreadPoolExecutor() as executor: # 并发执行爬取单个网页中所有的磁力链
res = executor.map(get_each, div_rows) return res def get_urls(baseurl, headers, suffix=None):
"""输入搜索网页,递归获取所有页的搜索结果"""
if suffix:
url = baseurl + suffix
else:
url = baseurl r = requests.get(url, headers=headers)
select = etree.HTML(r.text)
page_suffixes = select.xpath('//ul[@class="pagination pagination-lg"]'
'//li//a[@name="numbar"]/@href') # 有时该站会返回/search/.../search/...search/.../page,需要处理下
p = r'/search/[^/]+/page/\d+(?=\D|$)'
page_suffixes = [re.search(p, i).group() for i in page_suffixes] # 如果还有下一页,需要进一步递归查询获取
r = requests.get(url + page_suffixes[-1], headers=headers)
select = etree.HTML(r.text)
next_page = select.xpath('//ul[@class="pagination pagination-lg"]'
'//li//a[@name="nextpage"]/@href')
if next_page:
page_suffixes = page_suffixes + get_urls(baseurl, headers, next_page[0]) return page_suffixes if __name__ == '__main__':
keyword = "金刚狼3"
baseurl = 'https://btsow.club/search/{}'.format(keyword) # 该站是采用get方式提交搜索关键词
headers = {"Accept-Language": "en-US,en;q=0.8,zh-TW;q=0.6,zh;q=0.4"} urls = get_urls(baseurl, headers)
new_urls = list(set(urls))
new_urls.sort(key=urls.index)
new_urls = [baseurl + i for i in new_urls] with ThreadPoolExecutor() as executor:
res = executor.map(get_page_mlinks, new_urls, [headers for i in range(7)]) for r in res:
for i in r:
print(i)

2,逐页爬取

手工输入关键词和页数

超过网站已有页数时,返回None

爬取单个搜索页中所有磁力链时,仍然用的是并发

import requests
from lxml import etree
from concurrent.futures import ThreadPoolExecutor def get_mlink(url, headers):
"""输入某影片磁力链所在的网页,返回该网页中的磁力链"""
r = requests.get(url, headers=headers)
select = etree.HTML(r.text)
try:
magnetlink = select.xpath('//textarea[@id="magnetLink"]//text()')
return magnetlink[0]
except AttributeError:
return None def get_page_mlinks(url, headers):
"""输入某一页搜索结果,返回该网页中所有的元组(url, 影片大小,时间,磁力链)"""
r = requests.get(url, headers=headers)
select = etree.HTML(r.text)
div_rows = select.xpath('//div[@class="row"]') def get_each(se):
size = se.xpath('.//div[@class="col-sm-2 col-lg-1 hidden-xs text-right size"]//text()')
date = se.xpath('.//div[@class="col-sm-2 col-lg-2 hidden-xs text-right date"]//text()')
href = se.xpath('.//a/@href')
try:
return href[0], size[0], date[0], get_mlink(href[0], headers)
except IndexError:
pass with ThreadPoolExecutor() as executor: # 并发执行爬取单个网页中所有的磁力链
res = executor.map(get_each, div_rows) return res if __name__ == '__main__':
keyword = input('请输入查找关键词>> ')
page = input('请输入查找页>> ') url = 'https://btsow.club/search/{}/page/{}'.format(keyword, page)
headers = {"Accept-Language": "en-US,en;q=0.8,zh-TW;q=0.6,zh;q=0.4"} r = get_page_mlinks(url, headers)
for i in r:
print(i)

3,先输入影片,在选择下载哪个磁力链

import requests
from lxml import etree def get_mlink(url, headers):
"""输入某影片磁力链所在的网页,返回该网页中的磁力链"""
r = requests.get(url, headers=headers)
select = etree.HTML(r.text)
try:
magnetlink = select.xpath('//textarea[@id="magnetLink"]//text()')
return magnetlink[0]
except AttributeError:
return None def get_row(row):
size = row.xpath('.//div[@class="col-sm-2 col-lg-1 hidden-xs text-right size"]//text()')
date = row.xpath('.//div[@class="col-sm-2 col-lg-2 hidden-xs text-right date"]//text()')
href = row.xpath('.//a/@href')
title = row.xpath('.//a/@title')
try:
return href[0], size[0], date[0], title[0]
except IndexError:
pass if __name__ == '__main__':
headers = {"Accept-Language": "en-US,en;q=0.8,zh-TW;q=0.6,zh;q=0.4"} while True:
keyword = input('请输入查找关键词>> ')
if keyword == 'quit':
break
url = 'https://btsow.club/search/{}'.format(keyword)
r = requests.get(url, headers=headers)
print(r.status_code) select = etree.HTML(r.text)
div_rows = select.xpath('//div[@class="row"]')
div_rows = [get_row(row) for row in div_rows if get_row(row)]
if not div_rows:
continue
for index, row in enumerate(div_rows):
print(index, row[2], row[1], row[3]) # 选择和下载哪部片子
choice = input('请选择下载项>> ')
try: # 如果不是数字,退回到输入关键词
choice = int(choice)
except ValueError:
continue
download_url = div_rows[choice][0]
mlink = get_mlink(download_url, headers)
print(r.status_code)
print(mlink)
print('\n\n')

执行效果:

4,补充下lxml的使用

            <div class="item" data-houseid="*****">
*************************************************************
</div> <div class="item" data-houseid="107102426781">
<a class="img" href="https://sh.lianjia.com/ershoufang/107102426781.html" target="_blank" data-bl="list" data-log_index="5" data-housecode="107102426781" data-is_focus="" data-el="ershoufang">
<img class="lj-lazy" src="https://s1.ljcdn.com/feroot/pc/asset/img/blank.gif?_v=20200428212347" data-original="https://image1.ljcdn.com/110000-inspection/pc1_JZKtMEOU3_1.jpg.296x216.jpg.437x300.jpg">
<div class="btn-follow follow" data-hid="107102426781"><span class="star"></span><span class="follow-text">关注</span></div>
<div class="leftArrow"><span></span></div>
<div class="rightArrow"><span></span></div><div class="price"><span>375</span>万</div>
</a>
<a class="title" href="https://sh.lianjia.com/ershoufang/107102426781.html" target="_blank" data-bl="list" data-log_index="5" data-housecode="107102426781" data-is_focus="" data-el="ershoufang">临河位置,全明户型带边窗,满五年唯一,拎包入住</a>
<div class="info">
御桥
<span>/</span>
2室1厅
<span>/</span>
50.11平米
<span>/</span>

<span>/</span>
精装
</div>
<div class="tag"><span class="subway">近地铁</span><span class="vr">VR房源</span></div>
</div> <div class="tag"><span class="subway">近地铁</span><span class="vr">VR房源</span></div> </div> <div class="item" data-houseid="*****">
*************************************************************
</div>

要获取所有房源tilte,价格,朝向,装修情况等,可以:

elements = select.xpath('//div[@class="item"]')   # 所有房源组成的items列表,即所有class='item'的div标签

for element in elements:
title = element.xpath('a[@class="title"]/text()')[0] # class='item'的div标签下,所有class='title'的a标签
price = element.xpath('a[@class="img"]/div[@class="price"]/span/text()')[0]
_, scale, size, orient, deco = element.xpath('div[@class="info"]/text()') print(title, price, scale, size, orient, deco)

输入某小区的结果:

中间楼层+精装保养好+满两年+双轨交汇+诚意出售 385 2室1厅 62.7平米 南 精装
南北通风,户型方正,楼层佳位置佳,11/18号线双轨 368 2室1厅 52.49平米 南 精装
一手动迁 业主置换 急售 双南采光佳 看房方便 370 2室1厅 62.7平米 南 简装
临河位置,全明户型带边窗,满五年唯一,拎包入住 375 2室1厅 50.11平米 南 精装
一手动迁,税费少,楼层采光好,精装修。 388 2室1厅 62.7平米 南 精装
南北通两房 近地铁 拎包入住 业主诚意出售 508 2室2厅 90.88平米 南 其他

python爬取某站磁力链的更多相关文章

  1. 萌新学习Python爬取B站弹幕+R语言分词demo说明

    代码地址如下:http://www.demodashi.com/demo/11578.html 一.写在前面 之前在简书首页看到了Python爬虫的介绍,于是就想着爬取B站弹幕并绘制词云,因此有了这样 ...

  2. 用Python爬取B站、腾讯视频、爱奇艺和芒果TV视频弹幕!

    众所周知,弹幕,即在网络上观看视频时弹出的评论性字幕.不知道大家看视频的时候会不会点开弹幕,于我而言,弹幕是视频内容的良好补充,是一个组织良好的评论序列.通过分析弹幕,我们可以快速洞察广大观众对于视频 ...

  3. python爬取某站新闻,并分析最近新闻关键词

    在爬取某站时并做简单分析时,遇到如下问题和大家分享,避免犯错: 一丶网站的path为 /info/1013/13930.htm ,其中13930为不同新闻的 ID 值,但是这个数虽然为升序,但是没有任 ...

  4. 用python爬取B站在线用户人数

    最近在自学Python爬虫,所以想练一下手,用python来爬取B站在线人数,应该可以拿来小小分析一下 设计思路 首先查看网页源代码,找到相应的html,然后利用各种工具(BeautifulSoup或 ...

  5. Python爬取B站视频信息

    该文内容已失效,现已实现scrapy+scrapy-splash来爬取该网站视频及用户信息,由于B站的反爬封IP,以及网上的免费代理IP绝大部分失效,无法实现一个可靠的IP代理池,免费代理网站又是各种 ...

  6. python爬取b站排行榜

    爬取b站排行榜并存到mysql中 目的 b站是我平时看得最多的一个网站,最近接到了一个爬虫的课设.首先要选择一个网站,并对其进行爬取,最后将该网站的数据存储并使其可视化. 网站的结构 目标网站:bil ...

  7. Python爬取b站任意up主所有视频弹幕

    爬取b站弹幕并不困难.要得到up主所有视频弹幕,我们首先进入up主视频页面,即https://space.bilibili.com/id号/video这个页面.按F12打开开发者菜单,刷新一下,在ne ...

  8. Python爬取B站耗子尾汁、不讲武德出处的视频弹幕

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 前言 耗子喂汁是什么意思什么梗呢?可能很多人不知道,这个梗是出自马保国,经常上网的人可能听说过这个 ...

  9. 使用python爬取P站图片

    刚开学时有一段时间周末没事,于是经常在P站的特辑里收图,但是P站加载图片的速度比较感人,觉得自己身为计算机专业,怎么可以做一张张图慢慢下这么low的事,而且这样效率的确也太低了,于是就想写个程序来帮我 ...

随机推荐

  1. Kafka笔记7(构建数据管道)

    构建数据管道需要考虑的问题: 及时性  可靠性 高吞吐量和动态吞吐量   数据格式  转换    安全性   故障处理能力  耦合性与灵活性 数据管道的构建分为2个阵营,ETL和ELT ETL:提取- ...

  2. UGUI动态更换精灵图片

    //动态更换精灵图片 m_headimage.overrideSprite = Resources.Load("texture/"+info.HeadPortrait,typeof ...

  3. python模块之re模块

    # 正则表达式是用来匹配字符串的方法 # 字符串本身就有匹配方式,为什么要引入正则表达式? 因为原有的字符串匹配不出来原始的方法 # 正则匹配是用来进行模糊匹配的 s = "alex wan ...

  4. JAVA多线程实现的四种方式(转自https://www.cnblogs.com/felixzh/p/6036074.html)

    Java多线程实现方式主要有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来创建Thread线程.使用ExecutorService.Cal ...

  5. 工厂方法 Factory Method

    背景:有一个应用框架,它可以向用户显示多个文档.在这个框架中,两个主要的抽象是类Application和Document.这两个类都是抽象的.客户必须通过它们的子类来做与举替应用相关的实现. 分析:因 ...

  6. 淘宝客订单api处理优化

    首选我们看看api定义: http://open.taobao.com/api.htm?docId=38078&docType=2&scopeId=14474 注意下span这个参数 ...

  7. SpringCloud入门之应用程序上下文服务(Spring Cloud Context)详解

    构建分布式系统非常复杂且容易出错.Spring Cloud为最常见的分布式系统模式提供了简单易用的编程模型,帮助开发人员构建弹性,可靠和协调的应用程序.Spring Cloud构建于Spring Bo ...

  8. LP-KPN

    LP-KPN 网络结构 网络解析 1. 网络结构中绿色星星标志 公式.其实就是用预测出来的核在原图片经过Laplacian pyramid decomposes 后的图片上进行卷积运算.所以应该使用p ...

  9. 实际用到的linux小方法

    2019.4.261.解决ssh端中文乱码 (1).查看系统(window)的字符集,在命令行界面顶端空白处,右键->属性->选项   底端查看即可. (2).ssh上查看系统支持的字符集 ...

  10. C博客作业05--指针

    1. 本章学习总结 1.1 思维导图 1.2 本章学习体会及代码量学习体会 1.2.1 学习体会 这几周学习了指针,指针是C语言的一个重要的概念,也是特色之一.它可以通过对地址的访问来改变值,所以它的 ...