最近发现了一个问题,经常记了或者听到看到一些想读的书,但是又有点懒,不想一本书一本书去找,而且在学校图书馆的网站查了之后还要去记书在什么地方或者拍一下去找,于是就想能不能用selenium自动化的到学校图书馆官网去抓取图书信息,然后发送到自己的邮箱。经过了几个小时的实践,发现确实可行,以下是实现过程。主要分两部分,第一部分是图书信息的抓取,第二部分是将抓取的信息发送至指定邮箱。
图书信息的抓取设想的是通过用户输入一本或多本书名,用selenium传参至图书馆网站的搜索框,模拟点击后返回搜索结果,对学校图书馆网站进行分析发现不需要登录就可以进行图书检索,因此大大简化了工作,以为只用selenium打开网页,传参,模拟点击就可以,具体的代码实现如下
driver = webdriver.PhantomJS()
driver.get('http://202.205.213.113:8080/opac/search.php')
driver.find_element_by_xpath('//*[@id="strText"]').send_keys(bookname)
driver.find_element_by_xpath('/html/body/div[4]/div[1]/fieldset/div/form/div/input[3]').click()
进群:5483777875 即可获取数十套PDF哦!
但实际检查源网页发现馆藏信息其实隐藏在另外一个链接里,具体分析这个链接发现是一个get请求的网址,因此需要进一步构造网址用requests再返回页面信息,采用pyquery对返回的页面网址进行图书在馆信息的提取,该信息保存在页面的table下的tr td标签下 ,具体代码实现如下:
提取构造网址
doc = pq(driver.page_source)
if doc('.book_list_info'):
info = doc('.book_list_info')
# shujia = info('h3').text()
# status = info('p span').text()
detailurl = 'http://202.205.213.113:8080/opac/' + info('p a').attr('href')
return detailurl
else:
return '没有此书'
解析返回图书信息
def getinfo(url):
result = []
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/62.0'}
res = requests.get(url, headers=headers)
detail = pq(res.text)
binformation = []
bookinfo = detail('.booklist').items()
for b in bookinfo:
binformation.append(b.text())
dinformation = []
for d in detail('#item tr').items():
dinformation.append(d.text().replace('', ''))
result.append(binformation[0].replace('', ''))
result.append(binformation[1].replace('', ''))
result = result + dinformation[1:]
return result
以上部分完成了图书信息的抓取,接下来是将图书信息发送至邮箱,采用的是
smtplib模块,需要输入主题邮件正文和发送至的邮箱地址。此处隐去了发送这的邮箱和密码,需要使用者填写自己的邮箱。
def sendmail(subject,body,receiver):
smtpserver = "smtp.163.com"
port = 465
sender = "xfs9619@163.com"
psw = ""
receiver = input('请输入你的图书信息要发送至的邮箱')
msg = MIMEMultipart()
msg["from"] = sender
msg["to"] = ','.join(receiver)
msg["subject"] = subject
body = MIMEText(body, "plain", "utf-8")
msg.attach(body)
try:
smtp = smtplib.SMTP()
smtp.connect(smtpserver) # 连服务器
smtp.login(sender, psw)
except:
smtp = smtplib.SMTP_SSL(smtpserver, port)
smtp.login(sender, psw) # 登录
smtp.sendmail(sender, receiver, msg.as_string()) # 发送
smtp.quit()
return '发送成功'
最后使用input让用户输入需要的书名,将书名和抓取到的图书信息传入sendmail函数中,并返回发送结果:
if __name__ == '__main__':
putinbook = input('请输入要发送的书籍信息,若有多本,以逗号隔开')
booknamelist = [x for x in putinbook.split(',') if x]
for b in booknamelist:
url = getdetailurl(b)
if url == '没有此书':
res = '%s 没有找到'%b
else:
res = getinfo(url)
data = ''.join(res)
result = sendmail('%s'%b, data)
print(result)
程序运行的最终结果如下:
邮箱测试接收结果如下:
网友评论