网页抓取数据百度百科( 2.按前述结束日期(月份)来作为终止新闻链接、标题及时间 )

优采云 发布时间: 2021-12-05 18:08

  网页抓取数据百度百科(

2.按前述结束日期(月份)来作为终止新闻链接、标题及时间

)

  

python网页信息采集

引言1.前期准备2.自动控制鼠标下滑,保存已加载的网页3.获取页面的所有新闻链接、标题及时间,生成excel表格4.从生成的列表中,获取每个链接的新闻内容,生成docx

<a id="_2"></a>引言

<p>这是第一次实战,帮忙从俄新社网页链接下载关于中国的新闻,技术不行,还是得配上个人操作才能完成。

<a id="1_6"></a>1.前期准备

  选择好日期,或者其他筛选项。<br />

<br /> 这网页第一次会出现加载选项,要自己点,后面下滑都会动态加载了。<br />

<a id="2_12"></a>2.自动控制鼠标下滑,保存已加载的网页

  发现前期准备直接用selenium模块直接打开页面,选择日期,获取数据的方式,浏览器都会突然关闭。所以只能前期自己打开浏览器,手动选好页面,然后selenium继续控制,才能正常加载。<br /> 1.python+selenium控制已打开页面<br /> 参考链接

Win:

chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\Users\Administrator\Desktop\ria_ru"

Mac:

chrome启动程序目录:/Applications/Google Chrome.app/Contents/MacOS/

进入chrome启动程序目录后执行:

./Google\ Chrome --remote-debugging-port=9222 --user-data-dir="/Users/lee/Documents/selenum/AutomationProfile"

参数说明:

--remote-debugging-port

可以指定任何打开的端口,selenium启动时要用这个端口。

--user-data-dir

指定创建新chrome配置文件的目录。它确保在单独的配置文件中启动chrome,不会污染你的默认配置文件。

</p>

  2.按照之前的准备,在打开的浏览器中手动选择需要的页面

  3.自动滚动,保存加载的页面

  技术太差了。我不知道这种动态加载的网页如何选择结束条件。我发现新闻是从新到旧排序的,所以我又选择了一个结束日期(月份)作为结束条件。

  from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium. webdriver.common.keys import Keys

import time

def Stop_Month(self, stop_month):

#通过获取指定日期的前一个日期判断加载是否完成,需要多选择前一个日期

htmldateElems = browser.find_elements_by_class_name(&#39;list-item__date&#39;)

month_str = htmldateElems[-1].text.split()

return month_str[1]

def mouse_move(self, stop_month): # 滑动鼠标至底部操作

htmlElem = browser.find_element_by_tag_name(&#39;html&#39;)

while True:

htmlElem.send_keys(Keys.END)

time.sleep(1)

month = Stop_Month(self, stop_month)

print(month)

if stop_month == month:

print(&#39;****Arrived at the specified month interface****&#39;)

break

options = Options()

options.add_experimental_option(&#39;debuggerAddress&#39;, "127.0.0.1:9222")

browser = webdriver.Chrome(chrome_options=options)

browser.implicitly_wait(3)

stop_month = &#39;декабря&#39;

mouse_move(browser, stop_month)

f = open(&#39;0631-0207.html&#39;, &#39;wb&#39;)

f.write(browser.page_source.encode("utf-8", "ignore"))

print(&#39;****html is written successfully****&#39;)

f.close()

  3.获取页面所有新闻链接、标题和时间,并生成excel表格

  下载的网页实际上已经收录了所有的新闻链接、标题和时间。问题是如何提取它们。

  import openpyxl re, bs4

def Links_Get(self):

&#39;&#39;&#39;获取链接&#39;&#39;&#39;

downloadFile = open(self, encoding=&#39;utf-8&#39;)

webdata = bs4.BeautifulSoup(downloadFile.read(), &#39;html.parser&#39;)

elems = webdata.find_all(attrs={&#39;class&#39;: &#39;list-item__title color-font-hover-only&#39;})

link_regex = re.compile(r&#39;http(.*)html&#39;)

links=[]

for elem in elems:

a = link_regex.search(str(elem))

links.append(a.group())

return links

def Titles_Get(self):

&#39;&#39;&#39;获取标题&#39;&#39;&#39;

downloadFile = open(self, encoding=&#39;utf-8&#39;)

webdata = bs4.BeautifulSoup(downloadFile.read(), &#39;html.parser&#39;)

elems = webdata.find_all(attrs={&#39;class&#39;: &#39;list-item__title color-font-hover-only&#39;})

#查找所有包含这个属性的标签

titles=[]

for elem in elems:

titles.append(elem.text)

return titles

def Get_Link_to_Title(self, title, excel, i):

&#39;&#39;&#39;信息写入excel&#39;&#39;&#39;

excel[&#39;A%s&#39;%(i)] = i

#获取时间列表

date_regex = re.compile(r&#39;\d+&#39;)

a = date_regex.search(self)

excel[&#39;B%s&#39;%(i)] = a.group()

excel[&#39;C%s&#39;%(i)] = title

excel[&#39;D%s&#39;%(i)] = self

print("****%s successful****" % i)

links = Links_Get(&#39;0631-0207.html&#39;) #前面下载网页保存在工作目录

titles = Titles_Get(&#39;0631-0207.html&#39;)

nums1 = len(links)

nums2 = len(titles)

if nums1 == nums2:#一般的话,应该是对应的,不行的话,再看吧

i, j = 1, 0

#事先新建一个excel,再加载写入

time_title_link = openpyxl.load_workbook(&#39;time_title_link.xlsx&#39;)

time_title_link.create_sheet(&#39;0631-0207&#39;)

for link in links:

get_news.Get_Link_to_Title(link, titles[j], time_title_link[&#39;0631-0207&#39;], i)

print(str(i), str(nums1))

if link == links[-1]:

time_title_link.save(&#39;time_title_link.xlsx&#39;)

print(&#39;Succeessful save&#39;)

i += 1

j += 1

print(&#39;****Succeessful all****&#39;)

else:

print(&#39;Error, titles != links&#39;)

  4.从生成的列表中获取每个链接的新闻内容并生成docx

  import openpyxl

import docx

def Get_News(self, doc):

res = requests.get(self)

res.raise_for_status()

NewsFile = bs4.BeautifulSoup(res.text, &#39;html.parser&#39;)

elems_titles = NewsFile.select(&#39;.article__title&#39;)

date_regex = re.compile(r&#39;\d+&#39;)

a = date_regex.search(self)

date_str = &#39;a[href=&#39; + &#39;"/&#39; + a.group() + &#39;/"]&#39;

elems_dates = NewsFile.select(date_str)

elems_texts = NewsFile.select(&#39;.article__text&#39;)

head0 = doc.add_heading(&#39;&#39;, 0)

for title in elems_titles:

head0.add_run(title.getText() + &#39; &#39;)

print(&#39;title write succeed&#39;)

head2 = doc.add_heading(&#39;&#39;, 2)

for date in elems_dates:

head2.add_run(date.getText())

print(&#39;date write succeed&#39;)

for text in elems_texts:

doc.add_paragraph(text.getText())

print(&#39;text write succeed&#39;)

doc.add_page_break()

workbook = openpyxl.load_workbook(r&#39;time_title_link.xlsx&#39;)

sheet = workbook[&#39;0631-0207&#39;]

doc = docx.Document()

i = 1

for cell in sheet[&#39;D&#39;]:

if cell.value == &#39;URL&#39;:

continue

elif cell.value != &#39;&#39;:

Get_News(cell.value, doc)

print(str(i))

i += 1

else:

doc.save(&#39;0631-0207.docx&#39;)

break

print(&#39;****Succeessful save****&#39;)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线