外文网站pdf文档的爬取

news/2024/5/20 13:00:34/文章来源:https://blog.csdn.net/weixin_30654419/article/details/96443299

今天的任务是爬取外文网站所有pdf链接:

今天的程序不同的是我写了两个程序,其实可以写在一起的,但是两个好理解,首先我拿到所有详情页的链接,保存到数据库,然后去数据库拿出来一条一条访问详情页得到想要的内容

网站链接如下:https://ntrs.nasa.gov/search.jsp?N=4294129243

获取的内容有点多,大部分只要详情页有的都要,

获取所有链接代码如下:

import pymysql
import pymongo
import requests
from urllib.parse import urlencode
from lxml import etree
import hashlib
from multiprocessing.pool import Pool
from requests import codes
import lxml
import re
from bs4 import BeautifulSoup


def get_html(url):
try:
r = requests.get(url)
if codes.ok == r.status_code:
return r.text
except requests.ConnectionError:
return None

def get_urls(html):
soup = BeautifulSoup(html, 'lxml')
a = soup.find_all('form')
b = a[1].find_all('tr')
for i in b:
urls = i.find_all('a')
url_2 = urls[0]['href']
url_3 = 'https://ntrs.nasa.gov/' + url_2
# print(url_3)
md5 = md5Encode(url_1=url_3)
result = {
'md5': md5,
'url': url_3,
'state': 0
}
save_to_mongo(result)

def save_to_mongo(result):
client = pymongo.MongoClient('localhost', connect=False)
db = client['day6']
try:
# 加个判断, 如果插入数据失败,再次循环
if db['day6_tb'].insert(result):
print("insert into mongo success", result)
# 查询当前存储的数据条数
print('当前已存储%d条数据' % db.day6_tb.find().count())
return True
else:
print('插入失败')
return False
except:
print('md5重复')
def md5Encode(url_1):
# 创建md5对象
m = hashlib.md5()
# 传入需要加密的字符串
m.update(url_1.encode("utf8"))
# 返回加密之后的字符串
return m.hexdigest()



def main():
for i in range(3655, 27311):
page = i * 10
params = {
'No=': page
}
q = urlencode(params).replace('%3D', '')
base_url = 'https://ntrs.nasa.gov/search.jsp?N=4294129243&'
# print(base_url)
url = base_url + q
print(url)
html = get_html(url=url)
m = get_urls(html)





if __name__ == '__main__':
# main()
pool = Pool(10)
for i in range(20):
pool.apply_async(main)
pool.close()
pool.join()

 

 

获得所有详情页内容代码如下:

# 导入相关模块
import pymongo
import pymysql
from requests import codes
import requests
import hashlib
from multiprocessing.pool import Pool
import datetime
import lxml
import re
from lxml import etree
from bs4 import BeautifulSoup

# 打开数据库连接
db2 = pymysql.connect(host="192.168.8.212", user="sa", password="123456", db="Search")
# 使用cursor()方法获取操作游标
cursor = db2.cursor()
# 创建表
sql = '''
CREATE TABLE IF NOT EXISTS Day6(
id VARCHAR (20) NOT NULL,
title NVARCHAR (4000) NOT NULL,
author NVARCHAR (4000) NOT NULL,
patent number VARCHAR (100) NOT NULL,
page VARCHAR (100) NOT NULL,
abstract NVARCHAR (max) NOT NULL,
researchDirection NVARCHAR (4000) NOT NULL,
data NVARCHAR (25) NOT NULL,
url VARCHAR (255) NOT NULL,
md5 VARCHAR (255) NOT NULL
)
'''

client = pymongo.MongoClient('localhost', 27017)
db = client['day6']
table = db['day6_tb']


def get_html(url):
try:
r = requests.get(url)
if codes.ok == r.status_code:
return r.text
except requests.ConnectionError:
return None

def md5_Encode(url_1):
# 创建md5对象
m = hashlib.md5()
# 传入需要加密的字符串
m.update(url_1.encode("utf8"))
# 返回加密之后的字符串
# print('pppppp')
return m.hexdigest()



def download_url():
while 1:
data = table.find_one_and_update({"state": 0}, {"$set": {"state": 1}}) # 替换MongoDB中的第一个匹配的数据
# 此函数匹配第一个参数,若存在,则用第二个替换,若无匹配则反回None
if not data:
# 如果替换则表示已下载,not None为True,跳出循环
return
data["state"] = 1
url = data["url"]
# print(url)
html = get_html(url=url)
# print(html)
content = etree.HTML(html)
try:
# 标题加作者
titles = content.xpath('//table[@id="doctable"]//tr[1]//text()')
# print(titles)
# print(titles[0])
# 标题
# title = (titles[0],)
title = (titles[0])
# print(title)
# 作者 作者单位
# author = (titles[1],)
author = (titles[1])
# print(author)
# pdf链接
pdfs = content.xpath('//table[@id="doctable"]//a/@href')
pdf = pdfs[0]
# print((pdfs[0],))
# 抽象
abstract = content.xpath('//td[contains(text(),"Abstract:")]/following-sibling::td/text()')
abstract = abstract[0].strip()
# print((abstract,))
# 发布日期
data = content.xpath('//td[contains(text(),"Publication Date:")]/following-sibling::td/text()')
data = data[0].strip()
# print((data,))
# 文件编号
number = content.xpath('//td[contains(text(),"Document ID:")]/following-sibling::td/div/text()')
number = number[0].strip()
# print((number,))
# 学科类别
researchDirection = content.xpath('//td[contains(text(),"Subject Category:")]/following-sibling::td/text()')
researchDirection = researchDirection[0].strip()
# print((researchDirection,))
# 专利号
number_2 = content.xpath('//td[contains(text(),"Report/Patent Number:")]/following-sibling::td/text()')
number_2 = number_2[0].strip()
# print((number_2,))
# 页码
page = content.xpath('//td[contains(text(),"Description:")]/following-sibling::td/text()')
# print(page[0])
b = str(page[0])
# c = (b.split(';')[0].strip(),)
c = (b.split(';')[0].strip())
# print(c)
md5 = md5_Encode(pdf)
# print('111', md5)
result = {
'url': pdfs[0],
'md5': md5,
'num': number,
'title': title,
'patent number': number_2,
'author': author,
'page': c,
'summary': abstract,
'researchDirection': researchDirection,
'data': data
}
table = 'Day6'
keys = ','.join(result.keys())
values = ','.join(['%s'] * len(result))
sql = "INSERT INTO {table}({keys}) VAULES ({vaules})".format(table=table, keys=keys, values=values)
# sql = "insert into Day6(id,title,author,patent,number,page,abstract,researchDirection,data,url,md5) values ('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')"
try:
if cursor.execute(sql, tuple(result.values())):
print('储存成功')
db2.commit()
# cursor.execute(sql, (id,title,author,patent,number,page,abstract,researchDirection,data,url,md5))
# db.commit()
except:
print('储存失败')
db2.rollback()
db2.close()
except Exception as e:
print(e)
pass


if __name__ == '__main__':
pool = Pool(10)
for i in range(20):
pool.apply_async(download_url)
pool.close()
pool.join()

# 4一般代表电脑核数
# p = Pool(4)
# for i in range(5):
# p.apply_async(download_url, args=(i,))
# p.close()
# p.join()
# download_url()


数据库内容如下,因为公司要求储存到MySQL数据库,但是现在连接不上,所以储存到MongoDB看一下:


转载于:https://www.cnblogs.com/zycpcw/p/10141138.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_737832.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站笔记

多个html共用一段代码(例如banner,footer等):方法工具:站长之家html转jswebstorm提示requested without authorization,页面未授权https://blog.csdn.net/Demar_Deng/article/details/83346118 转载于:http…

Windows Azure 网站上的 WordPress 3.8

编辑人员注释:本文章由 Windows Azure 网站团队的项目经理 Sunitha Muthukrishna 和 Windows Azure 网站开发人员体验合作伙伴共同撰写。 WordPress 3.8 的代号“Parker”是为了纪念bebop创新者Charlie Parker,现已在 Windows A…

真实案例:网站遭遇DOS***

网站遭遇DOS***(如果对DOS***原理不太理解,大家可以先看下面这段视频:http://www.tudou.com/programs/view/U0_G3LitPMY/)一、事件背景长假对于IT人员来说是个短暂的休整时期,可IT系统却一时也不能停,越是节假日,越可能…

ssm重新开发计科院新闻网站

SSM(SSM 框架集) SSM(SpringSpringMVCMyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容)。常作为数据源较简单的web项目的框架。Spring   Spring就像是整个项目中装配…

如何防止博客,网站被挂马

2019独角兽企业重金招聘Python工程师标准>>> 经营网站不容易,网站被挂马或者被挂暗链说明网站的管理权限已落入他人之手,而且网站被挂马往往来给网站带来不可估量的负面影响,最常见的就是网站用户体验变形、网站被无故植入莫名其妙…

mkdocs与jekyll 创建静态网站

2019独角兽企业重金招聘Python工程师标准>>> mkdocs教程:http://www.mkdocs.org/#installation(英文) http://markdown-docs-zh.readthedocs.org/zh_CN/latest/(中文) MacDown的下载包:http://yunpan.cn/cdmKrfvZs2fsc (提取码&am…

Meta Referrer标签:在SEO与互联网上的进阶

本文转载自 http://www.wdingyue.com/3766.html 通过HTTPS让网络更安全给站长带来了诸多好处,除了提升网站的安全性能,HTTPS 能够为未来的网络营销技术和SEO营销人员带来潜在的益处。 HTTPS的搜索结果数量一直在攀升,Dr. Pete的“MozCast数据”显示现在谷歌首页几…

源码讲解 node+mongodb 建站攻略(一期)第二节

源码讲解 nodemongodb 建站攻略(一期)第二节 上一节,我们完成了模拟数据,这次我们来玩儿真正的数据库,mongodb。 代码http://www.imlwj.com/download/nodejs/demo1.rar 首先给大家看看目录结构。 大家可以比对一下&…

favicon.ico 网站小图标标识

随便打开一个网页:比如 http://www.baidu.com/ 可以看到在浏览器的标签头上面显示了一个图标,这个图标是:,也就是我们常说的favicon.ico. 由于这篇文章主要讨论favicon.ico,以及各个浏览器对其的不同处理,所以还是新建…

如何让EcStore和微博同步来推广网站

EcStore是创建B2C商城的首选PHP系统,它功能强大、操作方便,安装后马上就能建立起一个自己的B2C商城,但建好后如何推广运营商城却不是件容易的事。 新浪微博用户数量大、传播速度快,互联网上拥有许多微博营销的成功案例如小米、淘宝…

网站美化:CSS3自定义修改浏览器滚动条

滚动条组件 ::-webkit-scrollbar //滚动条整体部分 ::-webkit-scrollbar-thumb //滚动条里面的小方块,能向上向下移动(或往左往右移动,取决于是垂直滚动条还是水平滚动条) ::-webkit-scrollbar-track //滚动条的轨道(里…

即使是菜鸟,也能配置出一个网站

2019独角兽企业重金招聘Python工程师标准>>> 对于刚进入IT行业的你,是否会觉得配置出一个像样的公司网站是很大的挑战?如果你有相同的感受,那么今天读过这篇文章之后,你的心情将会舒畅很多,因为我这名技术入…

SEO优化秘诀

为什么80%的码农都做不了架构师?>>> 全都在摘要里面了。 www.vpincha.cc 转载于:https://my.oschina.net/boolls/blog/681206

利用云存储快速实现网站备份

背景 真正运营过网站的人都知道,数据对一个网站来说至关重要,因此,网站数据备份也是日常必做工作。因为误操作,网站被攻击等种种原因都会导致数据丢失,这时,你才会明白“有备无患”的道理。而且由于站点文件…

[记录][python]python爬虫,下载某图片网站的所有图集

随笔仅用于学习交流,转载时请注明出处,http://www.cnblogs.com/CaDevil/p/5958770.html 该随笔是记录我的第一个python程序,一个爬去指定图片站点的所有图集,现在还是一个非常简陋的单线程程序。下一步是改写成多线程,…

网站标题、描述、关键词怎么设置?

瞬间感觉回答这个问题真的很头痛,完全回答清楚这个问题要写一两千字的教程,而且还不一定能保证小白能完全理解了,因为有些东西想做到比较好的程度,需要实践,需要对一个网站甚至两三个网站的TDK改改过好几遍之后才能真正…

【我是正义的化身】一个钓鱼网站的社工+渗透之路

昨天在空间看到一个朋友发动态,说自己被骗了2000多,说说里有一个钓鱼链接,于是我就打开来看看。因此而开始了一段社工渗透之旅。 因为这次社的是一个骗子,有些地方就不打码了。钓鱼网站:http://br.hjiu.zhoukouwang.ne…

WordPress再曝流行插件漏洞 影响上千万网站

WordPress的一个最为流行的插件现重大安全漏洞,导致上千万网站面临黑客入侵的危险。 该漏洞由WordPress漏洞扫描器的开发者瑞恩迪赫斯特(Ryan Dewhurst)发现,该插件名为“WordPress SEO by Yoast”,用于网站的搜索引擎优化,是最流…

python正则表达式修复网站文章字体不统一问题

网站的大框架下有定义的字体,包括字体大小和颜色等,用户发布文章的时候可能是从其他网站复制过来的文本,复制的过程也保留了字体描述信息。当文章在页面上显示的时候,默认先会使用文章中定义的字体,如果文章中字体不存…

视频网站使用H265编码能提高视频清晰度吗?

大部分的视频直播点播的流媒体服务使用的都是H264编码,但是更为便捷的H265编码已经得到了发展,越来越多的人更加倾向于H265编码格式了。为什么呢?h265编码压缩率比H264提高了一倍之多,在使用上也比H264更节省空间。大多数的视频行…