抓取网页新闻(Linux基础知识:定时器脚本上必须叫上一行#! )

优采云 发布时间: 2022-03-09 00:06

  抓取网页新闻(Linux基础知识:定时器脚本上必须叫上一行#!

)

  1、定时器

  1.1 总是执行程序

  直接在python脚本中添加几行代码,保持脚本运行

   scheduler = BlockingScheduler()

scheduler.add_job(mainAll, 'cron', second='*/50', hour='*/8')

print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))

try:

scheduler.start()

except (KeyboardInterrupt, SystemExit):

scheduler.shutdown()

  这里调用mainAll()函数,运行一次后8小时50秒阻塞

  1.2定点触发和执行程序

  (1)windows系统可直接配置,详情见博客

  (2)Linux系统很简单

  先用crontab -e打开文件,输入命令30 12 * * * python2.7 /x/test.py

  注意,test.py 脚本中的上一行必须调用#!/usr/local/bin/python2.7(你安装python的绝对路径)

  或者你可以在执行命令中给出绝对路径 30 12 * * * /usr/local/bin/python2.7 /x/test.py

  

  

  2、现在让我们看看页面是什么样子的

  

  

  网址很容易获取,都是正则的url = '' % (y, m, d)

  我目前的想法是点击首页计算有多少张sheets_len,然后每次点击一张sheet计算右下角有多少张文章titles_len,模拟点击第一个每张sheet下的sheet文章然后得到第二章图片,点击下一张一共titles_len-1次得到文章每一版的全部内容

  代码如下:

  # -*-coding:utf-8-*-

'''# 9.18

url = 'http://fjrb.fjsen.com/nasb/html/2017-09/18/node_122.htm' # 第一版

urlend = 'http://fjrb.fjsen.com/nasb/html/2017-09/18/node_131.htm' # 第十版

# 9.20

url = 'http://fjrb.fjsen.com/nasb/html/2017-09/20/node_122.htm' # 第一版

url = 'http://fjrb.fjsen.com/nasb/html/2017-09/20/node_129.htm' # 第十版

'''

import time

from selenium import webdriver

import pymysql

import uuid

from apscheduler.schedulers.blocking import BlockingScheduler

from datetime import datetime

import os

class mainAll(object):

def __init__(self):

self.conn = pymysql.connect(host='localhost', user='root', passwd='123', db='tianyan', port=3306, charset='utf8')

self.cur = self.conn.cursor() # 获取一个游标

self.main()

self.cur.close()

self.conn.close()

print('Tick! The time is: %s' % datetime.now())

def main(self):

# 获取当前年月日

y = time.strftime('%Y', time.localtime(time.time())) # 年

m = time.strftime('%m', time.localtime(time.time())) # 月

d = time.strftime('%d', time.localtime(time.time())) # 日

data_time = time.strftime('%Y-%m-%d', time.localtime(time.time())) # 抓取时间

data_time_now = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))

website = '海丝商报'

# 创建相应时间的url地址

url = 'http://fjrb.fjsen.com/nasb/html/%s-%s/%s/node_122.htm' % (y, m, d)

driver = webdriver.Chrome()

driver.get(url)

# 找到版面数

sheets = driver.find_element_by_xpath("//table[@cellpadding='2']")

sheets_len = len(sheets.find_elements_by_tag_name('tr'))

# 找到每个版面的标题数量

for sheet in range(3):

titles = driver.find_element_by_xpath("//table[@cellpadding='1']")

titles_len = int(len(titles.find_elements_by_tag_name('tr')) / 2)

content_type = driver.find_element_by_xpath("//table[@cellpadding='2']").find_elements_by_tag_name('tr')

content_type = content_type[sheet].text.split(':')[-1] # 以冒号为分隔符切开版面的文字

# 点击版面的第一篇文章

title_button = driver.find_element_by_xpath("//*[@id='demo']/table[1]/tbody/tr[3]/td[2]/table/tbody/"

"tr[4]/td/table/tbody/tr/td[2]/table/tbody/tr[1]/td/table/"

"tbody/tr[4]/td/div/table/tbody/tr[1]/td[2]/a")

title_button.click()

for title in range(titles_len):

# 找到主标题和子标题的table表

title_table = driver.find_element_by_xpath(

"//*[@id='demo']/table/tbody/tr[3]/td[2]/table/tbody/tr[4]//tr")

content_title = title_table.find_elements_by_tag_name('p')[0].text

content_subtitle = title_table.find_elements_by_tag_name('p')[1].text

content = driver.find_element_by_xpath("//table[@class='content_tt']").text

# 获取左下角每一版的所有标题的链接

content_id = driver.find_elements_by_xpath("//*[@id='demo']/table/tbody/tr[3]/td[1]/table/tbody/tr[3]/"

"td/table//a")

content_id = content_id[title].get_attribute('href')

content_id = content_id.split('content_')[-1].split('.')[0] # 正则表达式没有处理成功!!!!!

# content_id = driver.current_url

# 'http://fjrb.fjsen.com/nasb/html/2017-09/21/content_1055929.htm?div=-1'

idd = str(uuid.uuid1())

idd.replace('-', '')

# 新闻时间和爬取时间是一个时候 sentiment_source 和sentiment_website是同一处理的

lists = (idd, content_title, content_subtitle, website, data_time, url, website, data_time_now, content,

content_id, content_type)

driver.find_elements_by_xpath("//a[@class='preart']")[-1].click() # 点击下一篇章

# 当把一版的所有标题都走完以后,点击下一版,回到外层循环的页面

if title == titles_len - 1 and sheet == 0:

# 如果走到第一版的最后一篇,那么点击下一版

driver.find_elements_by_xpath("//a[@class='preart']")[0].click()

elif title == titles_len - 1 and sheet > 0:

# 如果走到除第一版的最后一篇,同样点击下一版,此时页面上还有上一版,所以

driver.find_elements_by_xpath("//a[@class='preart']")[1].click()

# 只找第一版,如果第一版第一篇的内容已经入库,那么就直接停止本次采集

flag = self.judge(content_id)

if flag > 0:

continue

# 我这里的break会不会让定时程序都停止了 有没有一个方法可以跳出整体循环

self.con(lists)

driver.close()

def con(self, table):

# 名称 职位 公司名称 entuid

sql = "INSERT INTO sentiment_info (sentiment_id, sentiment_title, sentiment_subtitle, sentiment_source," \

"sentiment_time, sentiment_url,sentiment_website,sentiment_create_time,sentiment_content," \

"sentiment_source_id,sentiment_type) VALUES ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s'," \

" '%s','%s')"

self.cur.execute(sql % table)

self.conn.commit()

# 第一页点击 driver.find_element_by_xpath("//a[@class='preart']").click() 即可到下一页

def judge(self, content_id):

sql = """SELECT COUNT(*) FROM sentiment_info WHERE sentiment_source='海丝商报'

AND sentiment_source_id='%s'""" % content_id

self.cur.execute(sql)

a = self.cur.fetchall()

a = max(max(a))

self.conn.commit()

return a

if __name__ == '__main__':

scheduler = BlockingScheduler()

scheduler.add_job(mainAll, 'cron', second='*/50', hour='*/8')

print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))

try:

scheduler.start()

except (KeyboardInterrupt, SystemExit):

scheduler.shutdown()

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线