<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="189343" data-post-id="189343">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="oltarasenko" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/oltarasenko/120/15709_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  oltarasenko
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p><a class="mention" href="/u/dogweather" rel="nofollow">@dogweather</a> great! It would be great to know more about your use case, to see if we can help.</p>
<p>Otherwise also please be warned that Scrapy  is far ahead of us in terms of stability and features. So it may be that a migration to Crawly will not be smooth, depending on your use case, and maybe will require patches to Crawly itself.</p>
<p>However from my side I can promiss my support with that things!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="189343" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/web-scraping-tools/4823/44">Post #43</a>
	                </div>
	            </div>
              <div id="likers-container-189343" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="189343"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #43"></div>
  </section>
</div>
    <div class="postbit" id="189401" data-post-id="189401">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="dogweather" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/dogweather/120/1906_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  dogweather
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Excellent - we have several scrapers running nightly, and are continually writing more, to extract online laws from various countries and locations. My startup, <a href="https://public.law" rel="noopener nofollow ugc">https://public.law</a>, makes the laws easier to read and search.</p>
<p>I use scrapers to create JSON representations of each legal resource. Usually, a collection of laws are hierarchical - a tree of e.g., Divisions &gt; Chapters &gt; Sections. And so I like to write scrapers which return a single JSON tree because it’s easier to capture the parent/child relationships while the spider is running, than to try to recreate it on import.</p>
<ul>
<li>A hierarchical Haskell scraper: <a href="https://github.com/public-law/nevada-revised-statutes-parser" class="inline-onebox" rel="noopener nofollow ugc">GitHub - public-law/nevada-revised-statutes-parser: Parses the Nevada NRS into well formed JSON · GitHub</a></li>
<li>A hierarchical Scrapy scraper: <a href="https://github.com/public-law/oregon-administrative-rules-parser" class="inline-onebox" rel="noopener nofollow ugc">GitHub - public-law/open-gov-crawlers: Parse government documents into well formed JSON · GitHub</a></li>
</ul>
<p>The final result, after import, is a website like this: <a href="https://nevada.public.law/statutes" class="inline-onebox" rel="noopener nofollow ugc">Nevada Revised Statutes (NRS)</a> — created from the Haskell scraper’s output.</p>
<p>Occasionally, we want to scrape a publication which is just a flat set of documents. E.g., not laws, but <a href="https://law.georgia.gov/opinions/official" rel="noopener nofollow ugc">Official Opinions</a>. In that case, I’m writing a traditional one-JSON-object-per-page scraper:</p>
<ul>
<li>A “flat” Scrapy scraper, in development, for the Opinions: <a href="https://github.com/public-law/oregon-administrative-rules-parser/blob/ga-ag-opinions/public_law/spiders/us/georgia_ag_opinions.py" rel="noopener nofollow ugc">https://github.com/public-law/oregon-administrative-rules-parser/blob/ga-ag-opinions/public_law/spiders/us/georgia_ag_opinions.py</a></li>
</ul>
<hr>
<p>So! You can see we’ve been trying several strategies — Haskell scrapers (running in Docker via a cron job) to Scrapy (running on Scraping Hub). But this looks like a great use case for Elixir / Beam / OTP.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="189401" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/web-scraping-tools/4823/45">Post #44</a>
	                </div>
	            </div>
              <div id="likers-container-189401" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="189401"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #44"></div>
  </section>
</div>
    <div class="postbit" id="190671" data-post-id="190671">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="oltarasenko" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/oltarasenko/120/15709_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  oltarasenko
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Hey, <a class="mention" href="/u/dogweather" rel="nofollow">@dogweather</a> I just wonder how it goes? E.g. I wonder if you have tried it out? Did you have any issues?</p>
<p>From our side, I have asked my colleagues to have a glance at the target you have shared. Taking into account that crawly can’t save data in a nested JSON, I have advised them to use a flat structure, injecting all fields into one basic item.</p>
<p>So far our results are far away from being ideal <img src="https://forum.elixirforum.com/images/emoji/apple/cry.png?v=15" title=":cry:" class="emoji" alt=":cry:" loading="lazy" width="20" height="20"><br>
see: <a href="http://crawlyui.com/spider?spider=Elixir.Spiders.OregonRegs" rel="noopener nofollow ugc">http://crawlyui.com/spider?spider=Elixir.Spiders.OregonRegs</a></p>
<p>I wonder if you tried it from your side, and if you have managed to gather more items than we did.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="190671" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/web-scraping-tools/4823/46">Post #45</a>
	                </div>
	            </div>
              <div id="likers-container-190671" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="190671"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #45"></div>
  </section>
</div>
    <div class="postbit" id="196288" data-post-id="196288">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="oltarasenko" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/oltarasenko/120/15709_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  oltarasenko
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Hey people, sorry for restoring this a bit old topic again, but I want to add another library called CrawlyUI to the discussion.</p>
<p>You might wonder why I decided to add another library here, as well as there are plenty here already. Well, I believe it’s somehow different as:</p>
<ol>
<li>It simplifies the preview of extracted data</li>
<li>Allows to schedule jobs on different nodes</li>
<li>Allows defining spiders from the UI, so you don’t have to write code at all, and will get a spider capable of extracting data.</li>
</ol>
<p>You can find the deployed version here: <a href="http://crawlyui.com/" rel="noopener nofollow ugc">http://crawlyui.com/</a><br>
And a short explanation on how to create a spider here: <a href="https://www.youtube.com/watch?v=1O-XArob5rU&amp;ab_channel=OlegTarasenko" rel="noopener nofollow ugc">https://www.youtube.com/watch?v=1O-XArob5rU&amp;ab_channel=OlegTarasenko</a></p>
<p>Really hope you will like it!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="196288" data-batch-url="/posts/batch_likers">
                        5
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/web-scraping-tools/4823/47">Post #46</a>
	                </div>
	            </div>
              <div id="likers-container-196288" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="196288"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #46"></div>
  </section>
</div>
    <div class="postbit" id="212217" data-post-id="212217">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="moshin" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/moshin/120/22774_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  moshin
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>This looks amazing, hope you find the time to develop it further!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="212217" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/web-scraping-tools/4823/48">Post #47</a>
	                </div>
	            </div>
              <div id="likers-container-212217" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="212217"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-last-post cat-last-post" title="Last post!"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <span class="all-loaded">— All posts loaded —</span>
</div></template></turbo-stream>